我正在用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;
所以我想知道是否存在有关级别以及如何定位的相关枚举类型定义。
答案 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;
}