libavcodec / libx264不尊重keyint_min

问题描述 投票:0回答:1

使用libavcodec 57.107.100,我有一些代码将帧编码为H.264,并且我正在调整设置以准备将要生成的视频通过DASH进行流传输,这需要一致的关键帧时序。因此,我将GOP设置为帧速率的4倍,并将keyint_min设置为与GOP相同,以便可以保证关键帧间隔与4秒段边界对齐。

我正在使用以下代码来构建AVCodec和AVCodecContext:

AVCodec* codec = NULL;
codec = avcodec_find_encoder_by_name("libx264");
AVCodecContext* avcodec_context = avcodec_alloc_context3(codec);
context->bit_rate = 200000;
context->height = 640;
context->width = 480;
context->keyint_min = 100;
context->gop_size = 100;
context->qmax = 31;
context->qmin = 2;
context->pix_fmt = AV_PIX_FMT_YUV420P;
context->time_base = (AVRational) {1, 25};

很显然,这里的keyint_min是100,但是当我执行程序时,libavcodec的stderr输出在编码开始时会这样说:

[libx264 @ 0x5577bde61f20] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX FMA3 BMI2 
AVX2
[libx264 @ 0x5577bde61f20] profile High, level 3.0
[libx264 @ 0x5577bde61f20] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=100 keyint_min=51 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=200 ratetol=1.0 qcomp=0.60 qpmin=2 qpmax=31 qpstep=4 ip_ratio=1.40 aq=1:1.00

为了强调,在该内容的第三行中,编码器说keyint = 100 keyint_min = 51。所以很明显,我的GOP正确设置为100,但是keyint_min没有得到遵守。由于FFMPEG文档很难处理,因此我无法找到答案。有人知道我在想什么吗?

c ffmpeg mpeg-dash libavcodec libx264
1个回答
0
投票
x264编码器会将keyint_min钳位到keyint/2+1

直接将选项传递给x264以避免IDR帧过早

例如

av_opt_set(context->priv_data, "x264opts", "no-scenecut", 0);

context->scenechange_threshold = 0;

© www.soinside.com 2019 - 2024. All rights reserved.