libavcodec / libx264 не уважает keyint_min - PullRequest
1 голос
/ 06 января 2020

Используя libavcode c 57.107.100, у меня есть некоторый код для кодирования кадров в H.264, и я работаю над настройкой параметров для подготовки результирующих видео для потоковой передачи с DA SH, что требует согласованной синхронизации ключевых кадров , Поэтому я устанавливаю GOP на 4x частоту кадров и устанавливаю keyint_min равным GOP, чтобы я мог гарантировать, что интервал ключевых кадров совпадает с границами сегмента 4 секунды.

Я использую следующий код для сборки AVCode c и 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, но когда я выполняю свою программу, вывод stderr из libavcode c говорит это, когда начинается кодирование:

[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 довольно сложно обращаться, я не смог найти ответ на этот вопрос. Кто-нибудь знает, что мне не хватает?

1 Ответ

2 голосов
/ 06 января 2020

Кодер x264 преобразует keyint_min в keyint/2+1

Передача параметра непосредственно в x264, чтобы избежать преждевременных кадров IDR

например,

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

или

context->scenechange_threshold = 0;
...