Какие настройки ffmpeg для обеспечения 0 дублированных кадров и 0 пропущенных кадров при записи в поток программы mpeg-2 с использованием ffmpeg/avfoundation на Mac?

Я пытаюсь записать в DVD-совместимый файл MPEG-2 (ffmpeg: -target ntsc-dvd) с выхода HDMI видеокамеры в коробку Magewell HDMI-USB 3.0 в 15-дюймовый MacBook Pro без сетчатки, выпущенный в конце 2012 года (четырехъядерный процессор 2.3, 16 ГБ ОЗУ, ssd), с использованием ffmpeg/avfoundation.

Я перепробовал все, что мог придумать или найти в Интернете. Я по-прежнему получаю дубликаты и пропущенные кадры, что приводит либо к проблемам синхронизации аудио / видео, либо к пропаданию звука, особенно для более длительных записей. Мне нужно, чтобы это было стабильно для записи до 2,5 часов. Это вывод Терминала для 1,5-часовой записи:

Lapaki:~ Lapaki$ /Users/Lapaki/Desktop/ffmpeg -f avfoundation -video_size 960x540 -pixel_format uyvy422 -framerate ntsc -i "XI:XI" -vf crop=iw-240:ih:120:0 -target ntsc-dvd -aspect 4:3 -q:v 3 -ab 256k /Users/Lapaki/Desktop/FF\ Test/`date +%F`\ `date +%H_%M_%S`.mpg
ffmpeg version 3.2.3-tessus Copyright (c) 2000-2017 the FFmpeg developers
  built with Apple LLVM version 8.0.0 (clang-800.0.42.1)
  configuration: --cc=/usr/bin/clang --prefix=/opt/ffmpeg --extra-version=tessus --enable-avisynth --enable-fontconfig --enable-gpl --enable-libass --enable-libbluray --enable-libfreetype --enable-libgsm --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-libschroedinger --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzmq --enable-version3 --disable-ffplay --disable-indev=qtkit --disable-indev=x11grab_xcb
  libavutil      55. 34.101 / 55. 34.101
  libavcodec     57. 64.101 / 57. 64.101
  libavformat    57. 56.101 / 57. 56.101
  libavdevice    57.  1.100 / 57.  1.100
  libavfilter     6. 65.100 /  6. 65.100
  libswscale      4.  2.100 /  4.  2.100
  libswresample   2.  3.100 /  2.  3.100
  libpostproc    54.  1.100 / 54.  1.100
Input #0, avfoundation, from 'XI:XI':
  Duration: N/A, start: 610606.984208, bitrate: N/A
    Stream #0:0: Video: rawvideo (UYVY / 0x59565955), uyvy422, 960x540, 29.97 fps, 29.97 tbr, 1000k tbn, 1000k tbc
    Stream #0:1: Audio: pcm_f32le, 48000 Hz, stereo, flt, 3072 kb/s
Output #0, dvd, to '/Users/Lapaki/Desktop/FF Test/2017-02-15 17_46_28.mpg':
  Metadata:
    encoder         : Lavf57.56.101
    Stream #0:0: Video: mpeg2video (Main), yuv420p, 720x480 [SAR 8:9 DAR 4:3], q=2-31, 6000 kb/s, 29.97 fps, 90k tbn, 29.97 tbc
    Metadata:
      encoder         : Lavc57.64.101 mpeg2video
    Side data:
      cpb: bitrate max/min/avg: 9000000/0/6000000 buffer size: 1835008 vbv_delay: -1
    Stream #0:1: Audio: ac3, 48000 Hz, stereo, fltp, 256 kb/s
    Metadata:
      encoder         : Lavc57.64.101 ac3
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> mpeg2video (native))
  Stream #0:1 -> #0:1 (pcm_f32le (native) -> ac3 (native))
Press [q] to stop, [?] for help
[swscaler @ 0x7fd315892800] Warning: data is not aligned! This can lead to a speedloss
frame=   20 fps=0.0 q=3.0 size=     298kB time=00:00:00.65 bitrate=3721.4kbits/sframe=   35 fps= 35 q=3.0 size=     498kB time=00:00:01.13 bitrate=3591.2kbits/sframe=   50 fps= 33 q=3.0 size=     708kB time=00:00:01.64 bitrate=3519.4kbits/sframe=   65 fps= 32 q=3.0 size=     920kB time=00:00:02.16  
...
 bitrate=2721.7kbits/frame=162094 fps= 30 q=3.0 size= 1796936kB time=01:30:08.47 bitrate=2721.7kbits/frame=162109 fps= 30 q=3.0 size= 1797142kB time=01:30:08.98 bitrate=2721.8kbits/frame=162110 fps= 30 q=3.0 Lsize= 1797202kB time=01:30:09.01 bitrate=2721.9kbits/s dup=221 drop=0 speed=   1x    
video:1579050kB audio:168069kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 2.866632%

Я удалил среднюю часть (обозначенную "..."), которая представляет собой намного больше той же самой информации. К концу есть 221 повторяющиеся кадры, и для этого я не получил ни одного пропущенного кадра, но, похоже, это происходит и каждый раз.

С этим кодом звук, кажется, синхронизируется довольно хорошо, но я получаю небольшие пропуски каждые 30 секунд или около того. На этой записи есть отсевы по адресу:

00:00:43, 00:01:19, 00:01:47, 00:02:17, 00:03:18,...

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

Существует ли какой-то секретный код ffmpeg, чтобы гарантировать, что при захвате из живого источника в dvd-совместимые файлы mpeg-2 не будет пропущенных или дублированных кадров?

Когда я конвертирую практически любой тип файла в файлы MPEG-2, используя -target ntsc-dvdна этой машине скорость примерно равна 10x, так что, похоже, у нее не будет проблем с живым источником, верно?

Я также пытался использовать постоянную скорость передачи данных -b:v 5000k -minrate 5000k -maxrate 5000k -bufsize 2500k, что также не препятствует удалению / дублированию кадров.

Я попытался разделить аудио и видео входы, но это не решает проблему.

Я пытался использовать -vsync 0 на видеовходе, который, кажется, решает проблему, потому что на выходе не сообщается о дуплексах / падениях, но аудио / видео дрейфует синхронно все больше и больше, так что это тоже не сработало.

Большое спасибо за любую помощь. Я тестировал и тестировал и искал и искал в течение нескольких недель...

0 ответов

Другие вопросы по тегам