ffmpeg показывает ошибку «Блокировка очереди сообщений потока» при кодировании (не в реальном времени)

Надеюсь, кто-нибудь может мне помочь. Я использую ffmpeg для извлечения кадров из старого видео в виде изображений, пакетного улучшения и масштабирования изображений, а затем перекодирования изображений вместе с исходным звуком в новое видео. Это работает, и результат выглядит и звучит правильно, но я получаю эту ошибку/предупреждение во время процесса

[image2 @ 0000022193c2e8c0] Thread message queue blocking; consider raising the thread_queue_size option

Поскольку вывод кажется правильным, я не знаю, нужно ли мне беспокоиться об этом или нет. Означает ли это сообщение, что кадры были потеряны? Или это просто говорит мне, что я могу читать быстрее, чем писать?

Все, что я нахожу об этом в Интернете, исходит от людей, занимающихся кодированием в реальном времени во время потоковой передачи. Я могу понять, что ЦП может не справиться с этой ситуацией и пропустить несколько кадров, но я кодирую файлы на диске в другой файл на диске. Я бы предположил, что в этой ситуации программа просто заблокирует входные потоки до тех пор, пока выходные не догонят, вместо того, чтобы отбрасывать кадры, но я не уверен, поэтому и спрашиваю здесь.

Это происходит только в том случае, если я включаю аудиокопию в ту же команду. Я копирую из того же оригинального видео, из которого я сделал кадры (которое было закодировано со скоростью 29,97 кадра в секунду). Я вывожу видео с той же частотой кадров (я думаю). Есть ли что-то, что я делаю неправильно здесь?

> ffmpeg.exe -f image2 -framerate ntsc -i %%06d.png -i D:\encode\original.avi -map 0:v:0 -map 1:a:0 -acodec copy -c:v libx265 -crf 28 -preset medium -pix_fmt yuv420p -r ntsc D:\encode\new.mkv

ffmpeg version 4.3.1-2020-11-19-full_build-www.gyan.dev Copyright (c) 2000-2020 the FFmpeg developers
  built with gcc 10.2.0 (Rev5, Built by MSYS2 project)
  configuration: --enable-gpl --enable-version3 --enable-static --disable-w32threads --disable-autodetect --enable-fontconfig --enable-iconv --enable-gnutls --enable-libxml2 --enable-gmp --enable-lzma --enable-libsnappy --enable-zlib --enable-libsrt --enable-libssh --enable-libzmq --enable-avisynth --enable-libbluray --enable-libcaca --enable-sdl2 --enable-libdav1d --enable-libzvbi --enable-librav1e --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --enable-libaom --enable-libopenjpeg --enable-libvpx --enable-libass --enable-frei0r --enable-libfreetype --enable-libfribidi --enable-libvidstab --enable-libvmaf --enable-libzimg --enable-amf --enable-cuda-llvm --enable-cuvid --enable-ffnvcodec --enable-nvdec --enable-nvenc --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-libcdio --enable-libgme --enable-libmodplug --enable-libopenmpt --enable-libopencore-amrwb --enable-libmp3lame --enable-libshine --enable-libtheora --enable-libtwolame --enable-libvo-amrwbenc --enable-libilbc --enable-libgsm --enable-libopencore-amrnb --enable-libopus --enable-libspeex --enable-libvorbis --enable-ladspa --enable-libbs2b --enable-libflite --enable-libmysofa --enable-librubberband --enable-libsoxr --enable-chromaprint
  libavutil      56. 51.100 / 56. 51.100
  libavcodec     58. 91.100 / 58. 91.100
  libavformat    58. 45.100 / 58. 45.100
  libavdevice    58. 10.100 / 58. 10.100
  libavfilter     7. 85.100 /  7. 85.100
  libswscale      5.  7.100 /  5.  7.100
  libswresample   3.  7.100 /  3.  7.100
  libpostproc    55.  7.100 / 55.  7.100
Input #0, image2, from '%06d.png':
  Duration: 00:03:29.84, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: png, rgb24(pc), 1280x720, 29.97 fps, 29.97 tbr, 29.97 tbn, 29.97 tbc
Guessed Channel Layout for Input Stream #1.1 : stereo
Input #1, avi, from 'D:\encode\original.avi':
  Duration: 00:03:29.84, start: 0.000000, bitrate: 2202 kb/s
    Stream #1:0: Video: mpeg4 (DX50 / 0x30355844), yuv420p, 352x240 [SAR 1:1 DAR 22:15], 778 kb/s, 29.97 fps, 29.97 tbr, 29.97 tbn, 30k tbc
    Stream #1:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
Stream mapping:
  Stream #0:0 -> #0:0 (png (native) -> hevc (libx265))
  Stream #1:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
x265 [info]: HEVC encoder version 3.4+27-g5163c32d7
x265 [info]: build info [Windows][GCC 10.2.0][64 bit] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast LZCNT SSSE3 SSE4.2 AVX FMA3 BMI2 AVX2
x265 [info]: Main profile, Level-3.1 (Main tier)
x265 [info]: Thread pool created using 24 threads
x265 [info]: Slices                              : 1
x265 [info]: frame threads / pool features       : 4 / wpp(12 rows)
x265 [info]: Coding QT: max CU size, min CU size : 64 / 8
x265 [info]: Residual QT: max TU size, max depth : 32 / 1 inter / 1 intra
x265 [info]: ME / range / subpel / merge         : hex / 57 / 2 / 3
x265 [info]: Keyframe min / max / scenecut / bias  : 25 / 250 / 40 / 5.00
x265 [info]: Lookahead / bframes / badapt        : 20 / 4 / 2
x265 [info]: b-pyramid / weightp / weightb       : 1 / 1 / 0
x265 [info]: References / ref-limit  cu / depth  : 3 / off / on
x265 [info]: AQ: mode / str / qg-size / cu-tree  : 2 / 1.0 / 32 / 1
x265 [info]: Rate Control / qCompress            : CRF-28.0 / 0.60
x265 [info]: tools: rd=3 psy-rd=2.00 early-skip rskip mode=1 signhide tmvp
x265 [info]: tools: b-intra strong-intra-smoothing lslices=4 deblock sao
Output #0, matroska, to 'D:\encode\new.mkv':
  Metadata:
    encoder         : Lavf58.45.100
    Stream #0:0: Video: hevc (libx265), yuv420p, 1280x720, q=-1--1, 29.97 fps, 1k tbn, 29.97 tbc
    Metadata:
      encoder         : Lavc58.91.100 libx265
    Side data:
      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
    Stream #0:1: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, stereo, s16, 1411 kb/s
[image2 @ 0000022193c2e8c0] Thread message queue blocking; consider raising the thread_queue_size option (current value: 8)
frame= 6289 fps= 88 q=35.9 Lsize=   59028kB time=00:03:29.84 bitrate=2304.4kbits/s speed=2.92x
video:22746kB audio:36149kB subtitle:0kB other streams:0kB global headers:2kB muxing overhead: 0.226772%
x265 [info]: frame I:     34, Avg QP:28.64  kb/s: 2940.00
x265 [info]: frame P:   1520, Avg QP:30.35  kb/s: 1771.54
x265 [info]: frame B:   4735, Avg QP:33.71  kb/s: 588.33
x265 [info]: Weighted P-Frames: Y:3.4% UV:2.5%
x265 [info]: consecutive B-frames: 1.5% 0.6% 6.1% 75.2% 16.5%
 
encoded 6289 frames in 71.77s (87.63 fps), 887.02 kb/s, Avg QP:32.87

Ответы (1)

У меня была такая же проблема с такой настройкой, т.е. входными кадрами в формате PNG + аудио.

Мой обходной путь для отключения предупреждения был -thread_queue_sizeпараметром с максимально возможным значением (т.е. больше, чем мое общее количество кадров PNG) перед каждым вводом.

Учитывая, что у вас есть видеоклип продолжительностью ~3:30, я бы попробовал команду:

ffmpeg.exe -f image2 -framerate ntsc -thread_queue_size 5040 -i %%06d.png \
-thread_queue_size 5040 -i D:\encode\original.avi \
-map 0:v:0 -map 1:a:0 -acodec copy -c:v libx265 -crf 28 -preset medium \
-pix_fmt yuv420p -r ntsc D:\encode\new.mkv

Если сообщение действительно влияет на качество вывода, извините, не могу подтвердить. Для меня было быстрее просто установить лимит.