在 Mac 上使用 ffmpeg/avfoundation 捕获到 mpeg-2 程序流时,哪些 ffmpeg 设置可确保 0 重复帧和 0 丢帧?

aer*_*avo 6 macos ffmpeg mpeg-2 avfoundation

我正在尝试-target ntsc-dvd从摄像机的 HDMI 输出捕获到 DVD 兼容的 mpeg-2 文件 (ffmpeg :) 到 Magewell HDMI to USB 3.0 盒到我的 2012 年末 15" 非视网膜 MacBook Pro(四核 2.3、16gb) ram、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%
Run Code Online (Sandbox Code Playgroud)

我删除了中间部分(用“...”表示),这只是更多相同的累积信息。到最后,有 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,这台机器上的速度大约是 10 倍,所以跟上实时源似乎没有问题,对吧?

我也尝试过使用恒定比特率-b:v 5000k -minrate 5000k -maxrate 5000k -bufsize 2500k,这也不能防止丢失/重复帧。

我试过将音频和视频输入分开,但没有解决。

我试过-vsync 0在视频输入上使用,这似乎确实解决了问题,因为输出没有报告重复/丢失,但音频/视频越来越不同步,所以这也不起作用。

非常感谢您的帮助。我已经测试、测试、搜索和搜索了数周......