Как программно передать параметр кодировщика VP8 в программе на основе ffmpeg

Я создаю программу с использованием библиотек ffmpeg на основе стандартного примера транскодера ffmpeg. Моя цель — создать транскодер видео, который кодирует любое подходящее видео (т. е. которое ffmpeg может прочитать) в формат WEBM. Вопрос в том, как передать параметры кодировщику VP8 для управления качеством выходного видео и другими параметрами? Я имею в виду передачу этих опций через код C++.


person ivan.ukr    schedule 28.06.2016    source источник


Ответы (1)


Используйте следующий код:

AVDictionary *options = NULL;
AVCodec *codec = avcodec_find_encoder(AVCODEC_ID_VP8);
AVCodecContext *ctx = avcodec_alloc_context3(codec);

av_dict_set(&options, "option", "value", 0);

int res = avcodec_open2(ctx, codec, &options);
if (res < 0)
    error();

while (..) {
    res = avcodec_encode_video2(ctx, ..);
    if (res < 0)
        error();
}

avcodec_close(ctx);
avcodec_free_context(ctx);

Соответствующие пары «опция»/«значение» — это то, что вы могли бы получить из руководств по кодированию vp8, например. FFmpeg вики. Например, чтобы установить битрейт 1 Мбит/с (первый пример в вики), используйте:

av_dict_set_int(&options, "b", 1024 * 1024, 0);

or

av_dict_set(&options, "b", "1M", 0);

Я рекомендую использовать VP9 вместо VP8, вы не получите хорошего качества с VP8, но это, очевидно, ваш выбор.

person Ronald S. Bultje    schedule 28.06.2016
comment
Спасибо, это помогло мне. - person ivan.ukr; 30.06.2016