将ffmpeg命令行转换为C编解码器设置

我在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设置不带参数的选项的方式.

上一篇:python2(中文编码问题):UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position


下一篇:如何将mjpeg流保存为3gp或mp4格式的视频文件到android中的sdcard