Какой альтернативный способ склеить видеокадр в ffmpeg? - PullRequest
0 голосов
/ 06 мая 2020

так что, по сути, я рендеринг видео с помощью FFmpeg lib в c ++. какие методы оптимизации можно использовать для рендеринга быстрого кадра, чтобы я мог улучшить рендеринг видео?

// app data structure
typedef struct {
    AVFormatContext *fmt_ctx;
    int stream_idx;
    AVRational time_base;
    AVStream *video_stream;
    AVCodecContext *codec_ctx;
    AVCodecContext *pCodecCtxOrig;
    AVCodec *decoder;
    AVPacket *packet;
    AVFrame *av_frame;
    AVFrame *gl_frame;
    AVStream *pStream;
    struct SwsContext *conv_ctx;
} AppData;

 if (!data->conv_ctx) {
            data->conv_ctx = sws_getContext(data->codec_ctx->width,
                                            data->codec_ctx->height, data->codec_ctx->pix_fmt,
                                            data->codec_ctx->width, data->codec_ctx->height,
                                            AV_PIX_FMT_RGB0,
                                            SWS_FAST_BILINEAR, NULL, NULL, NULL);
        }
        if (!data->conv_ctx) {
            printf("Couldn't initialize sw scaler\n");
            return false;
        }

        sws_scale(data->conv_ctx, data->av_frame->data, data->av_frame->linesize, 0,
                  data->codec_ctx->height, data->gl_frame->data, data->gl_frame->linesize);
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, data->codec_ctx->width,
                        data->codec_ctx->height, GL_RGBA, GL_UNSIGNED_BYTE,
                        data->gl_frame->data[0]);

эта функция отображает видеокадр, который для меня менее эффективен при отображении видеокадра. как я могу избежать sws_scale и сопоставить видеокадры в OpenGL?

1 Ответ

0 голосов
/ 06 мая 2020

Вместо вызова sws_scale вы можете загрузить данные в текстуру и выполнить преобразование цвета во фрагментном шейдере при отрисовке кадра в место назначения. Поскольку вы можете встретить много разных форматов в codec_ctx->pix_fmt, вам потребуется вручную поддерживать множество различных преобразований. Для плоских форматов, таких как YUV420, вам может потребоваться создать отдельную текстуру для каждой плоскости.

Для дальнейшего улучшения, если FFMPEG декодируется на графическом процессоре, вы можете избежать передачи данных GPU-> CPU-> GPU, используя соответствующее взаимодействие между серверной частью FFMPEG и OpenGL. См. Как преобразовать текстуру ffmpeg в текстуру Open GL без копирования в память процессора . Излишне говорить, что это сложно из-за множества различных серверных частей.

...