【问题标题】:Translating ffmpeg command line to C++ codec settings将 ffmpeg 命令行转换为 C++ 编解码器设置
【发布时间】:2023-03-04 01:15:01
【问题描述】:

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

【问题讨论】:

    标签: c++ ffmpeg codec


    【解决方案1】:

    你做错了™

    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 了解如何设置不带参数的选项。

    【讨论】:

    • 谢谢,添加了 c->priv_data 是因为我看到它在 stackoverflow.com/questions/15898131/… 的 av_opt_set 中使用过,但现在更有意义了 :)。谢谢
    • 这是最接近我的问题的解决方案,但我一直在设置一个选项,在 CLI ffmpeg 中我像 ffplay -rtsp_transport tcp -i rtsp_address 一样设置了这个选项,但在 C 代码中我无法正确设置这个选项。我已将其粘贴到paste.ubuntu.com/p/zpnz4y8ytb。我不知道如何在 C 代码中设置 rtsp_transport。谢谢
    猜你喜欢
    • 2021-02-19
    • 2021-09-23
    • 2019-07-30
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多