我一直在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命令行参数?
答案 0 :(得分:2)
你做错了
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了解如何设置不带参数的选项。