Я некоторое время работал над ffmpeg в C ++.
Большая часть справки, касающейся настроек кодера, объясняется как параметры командной строки.
Например (взято с сайта ffmpeg):
-mbd rd -trellis 2 -cmp 2 -subcmp 2 -g 100 -pass 1/2’
но будьте осторожны, ‘-g 100’ может вызвать проблемы с некоторыми декодерами. Вещи, чтобы попробовать:
’-bf 2’, ’-flags qprd’, ’-flags mv0’, ’- flags skiprd.
Это не очень полезно, если вы хотите установить эти параметры в C.
Например мне удалось найти Int Trellis; в AVCodecContext структура так, что один решен, но как насчет других?
Есть ли способ определить, какие параметры командной строки соответствуют каким членам AVCodecContext?
Я попытался установить их так:
AVCodecContext* c;
av_opt_set_int(c->priv_data, "cmp", 2, 0);
Но это возвращает код ошибки, что опция не существует.
Я также попробовал:
av_opt_set(c->priv_data, "cmp", "2", 0);
Я все еще получаю ошибку, что опция не существует.
Итак, есть ли способ определить, какие члены AVCodecContext я должен установить, которые эквивалентны параметрам командной строки ffmpeg выше?
Вы делаете это неправильно ™
av_opt_set
(и друзья) взять объект типа AVClass
(доказательство). Не трогай priv_data
,
Вы должны заметить, что AVCodecContext
является AVClass
потому что это первый член AVClass
(что более или менее так, как «наследование» (злоупотреблять термином) работает в C).
Короче говоря, то, что вы должны делать, это:
AVCodecContext* c;
av_opt_set_int(c, "cmp", 2, 0);
Если вы хотите узнать, какие опции может выбрать конкретный класс, просто посмотрите на источник. Например, кодировщик libopenjpeg принимает много вариантов. Другие классы в avcodec / avformat определяют параметры, которые они принимают, очень похожим образом. Эти опции отбрасываются, когда вы делаете длинную помощь ffmpeg, но иногда обращение к источнику может пролить некоторый свет на вещи.
Кроме того, для дальнейшего использования и для помощи вам, возможно, вы захотите прочитай это как установить параметры, которые не принимают параметры.
Других решений пока нет …