我正在用 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/