2014-03-05 87 views
0

我一直在ffmpeg在C++中做了一些工作。 有关编码器设置的大多数帮助都是以命令行选项的形式来解释的。 例如(从FFmpeg的现场拍摄):翻译ffmpeg命令行为C++编解码器设置

-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命令行参数?

回答

2

你就错了™

av_opt_set(朋友)采取AVClass型(proof)的对象。请勿触摸priv_data

你应该注意到是AVClass,因为它是第一个成员是AVClass(这是用C或多或少如何“继承”(滥用术语)的作品)。

总之,你应该做的是:

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

如果你想知道哪些选择特定类别可以,只是看看源。例如,libopenjpeg编码器需要many options。 avcodec/avformat中的其他类以非常类似的方式定义它们所采用的选项。当你执行ffmpeg的长时间帮助时,这些选项会被舍弃,但有时候去源代码可以让事情变得轻松一些。

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

+0

谢谢,c-> priv_data被添加,因为我已经看到它在av_opt_set中使用http://stackoverflow.com/questions/15898131/video-created-using-ffmpeg-and-h264-codec-不玩在Android的玩家说 但它现在更有意义:)。谢谢 – Alex