c++ - 如何将视频级别分配给ffmpeg中的结构AVCodecContext?

标签 c++ ffmpeg

我正在用 ffmpeg 编写一个 C++ 视频编码 API。视频级别是一个重要的参数,但我不知道如何将它分配给 AVCodecContext。

看了ffmpeg文档,发现“level”是int类型,下面是avcodec.h文件第3014行的定义。

           /**
 3010      * level
 3011      * - encoding: Set by user.
 3012      * - decoding: Set by libavcodec.
 3013      */
 3014      int level;
 3015 #define FF_LEVEL_UNKNOWN -99

根据我的google搜索,level的值是从1.1(1.2,1.3,2...)到5.2,显然不是int类型。我认为级别应该是枚举类型,但我找不到关于它的任何定义。

我在网上看到一些用法,比如:

  AVCodecContect *pCtx;
  pCtx->level = 3;
  ....//or 
  pCtx->level = 50;

但我认为这些用法是错误的.. 我认为正确的分配方式是这样的:

  pCtx->level = FF_LEVEL_UNKNOWN;

所以我想知道是否有一些关于级别以及如何定位它的相关枚举类型定义。

最佳答案

假设您使用 H.264 标准对视频进行编码。通过将级别指定为 FF_LEVEL_UNKNOWN,编码器将为您选择合适的级别。通常这是最佳选择。

但如果你因为某些原因必须自己指定级别,只需将实际级别(可能是 1.1 或 3.1 等)乘以 10。Recommendation ITU-T H. 中有详细说明。 264,附件 A.3 关于如何选择级别。你也可以在编码器的代码中学习它们。和x264一样,代码位于encoder.c:

const x264_level_t *l = x264_levels;
if( h->param.i_level_idc < 0 )
{
    int maxrate_bak = h->param.rc.i_vbv_max_bitrate;
    if( h->param.rc.i_rc_method == X264_RC_ABR && h->param.rc.i_vbv_buffer_size <= 0 )
        h->param.rc.i_vbv_max_bitrate = h->param.rc.i_bitrate * 2;
    x264_sps_init( h->sps, h->param.i_sps_id, &h->param );
    do h->param.i_level_idc = l->level_idc;
        while( l[1].level_idc && x264_validate_levels( h, 0 ) && l++ );
    h->param.rc.i_vbv_max_bitrate = maxrate_bak;
}

关于c++ - 如何将视频级别分配给ffmpeg中的结构AVCodecContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56590239/

相关文章:

用于第 3 方库调用的 C++ 看门狗

c++ - 从静态辅助函数访问私有(private)成员

ffmpeg - 色度键我的过滤白色背景命令有效,但过滤白色和黑色?

c - 添加 avfilter 后编译 FFMPEG/libav 代码时出错

windows - 在 Visual Studio 中使用 FFmpeg

ffmpeg - RTP Stream 显示灰色背景然后崩溃

c++ - 如何为并行进程正确选择 rng seed

c++ - C++ 中的 'ref' 和 'sealed' 关键字是什么?

c++ - 是否可以使用 fmt 格式化带有千位分隔符的数字?

c++ - FFMPEG 帧到 DirectX 表面