我在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格;在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
(proof)类型的对象.不要触摸priv_data.
您应该注意到AVCodecContext
是AVClass,因为它的第一个成员是AVClass(或多或少是“继承”(滥用该术语)在C语言中的工作方式).
简而言之,您应该做的是:
AVCodecContext* c;
av_opt_set_int(c, "cmp", 2, 0);
如果您想知道特定类可以采用的选项,请查看源代码.例如,libopenjpeg编码器的值为many options.avcodec / avformat中的其他类以非常相似的方式定义了它们所采用的选项.当您执行ffmpeg的长期帮助时,这些选项将被放弃,但有时可以从源头上了解一些情况.
另外,为了将来参考并为您提供帮助,您可能希望read this设置不带参数的选项的方式.