如何在ffmpeg中将视频级别分配给struct AVCodecContext?

时间:2019-06-14 01:11:18

标签: c++ ffmpeg

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

我阅读了ffmpeg文档,发现“级别”是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

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

我在互联网上看到了一些用法,例如:

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

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

  pCtx->level = FF_LEVEL_UNKNOWN;

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

1 个答案:

答案 0 :(得分:1)

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

但是,如果由于某些原因必须自行指定级别,只需将实际级别(可能是1.1或3.1等)乘以10。Recommendation ITU-T H.264, Annex 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;
}