libavcodec/libx264 不尊重 keyint_min

libavcodec/libx264 isn't respecting keyint_min

使用 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 文档很难接近,我一直无法找到答案。有谁知道我错过了什么?

x264 编码器会将 keyint_min 钳位到 keyint/2+1

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

例如

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

context->scenechange_threshold = 0;