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

时间:2014-03-05 22:59:00

标签: c++ ffmpeg codec

我一直在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中设置这些选项时,这不是很有用。 例如,我设法在 AVCodecContext 结构中找到了 int trellis; ,这样就解决了,但其他的呢?

有没有办法确定哪些命令行参数对应哪些AVCodecContext成员? 我尝试像这样设置它们:

AVCodecContext* c;
av_opt_set_int(c->priv_data, "cmp", 2, 0);

但是这会返回该选项不存在的错误代码。 我也试过了:

  av_opt_set(c->priv_data, "cmp", "2", 0);

我仍然得到该选项不存在的错误。

那么,有没有办法确定我应该设置哪些AVCodecContext成员等同于上面的ffmpeg命令行参数?

1 个答案:

答案 0 :(得分:2)

你做错了

av_opt_set(和朋友)选择AVClassproof)类型的对象。请勿触摸priv_data

您应该注意到AVCodecContextAVClass因为它的第一个成员是AVClass(这或多或少是“继承”(滥用该术语)在C中的作用)

简而言之,您应该做的是:

AVCodecContext* c;
av_opt_set_int(c, "cmp", 2, 0);

如果您想知道特定课程可以选择哪些选项,请查看来源。例如,libopenjpeg编码器需要many options。 avcodec / avformat中的其他类以非常类似的方式定义它们所采用的选项。当你做ffmpeg的长期帮助时,这些选项会被抛弃,但有时候去源头可以解释一些事情。

此外,为了将来参考,并且为了帮助您,您可能希望read this了解如何设置不带参数的选项。