使用 ffmpeg 和 directshow 从 USB Grabber 捕获设备规格内的视频

Issue capturing video within device specs from a USB Grabber with ffmpeg & directshow

我正在使用 USB 采集卡(这个:http://www.logilink.com/Suche/vg0001a)来捕捉一些旧的 VHS 镜头。我正在将 ffmpeg 与 directshow 一起使用。设备属性如下:

[dshow @ 000001d57618a300] DirectShow video device options (from video devices)
[dshow @ 000001d57618a300]  Pin "Capture" (alternative pin name "0")
[dshow @ 000001d57618a300]   pixel_format=yuyv422  min s=640x480 fps=5 max s=640x480 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuyv422  min s=160x120 fps=5 max s=160x120 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuyv422  min s=176x144 fps=5 max s=176x144 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuyv422  min s=320x240 fps=5 max s=320x240 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuyv422  min s=352x288 fps=5 max s=352x288 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuyv422  min s=720x480 fps=5 max s=720x480 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuyv422  min s=720x576 fps=5 max s=720x576 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuv420p  min s=640x480 fps=5 max s=640x480 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuv420p  min s=160x120 fps=5 max s=160x120 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuv420p  min s=176x144 fps=5 max s=176x144 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuv420p  min s=320x240 fps=5 max s=320x240 fps=30
[dshow @ 000001d57618a300]   pixel_format=yuv420p  min s=352x288 fps=5 max s=352x288 fps=30
[dshow @ 000001d57618a300] Crossbar Switching Information for USB2.0 Grabber:
[dshow @ 000001d57618a300]   Crossbar Output pin 0: "Video Decoder" related output pin: 1 current input pin: 0 compatible input pins: 0 1
[dshow @ 000001d57618a300]   Crossbar Output pin 1: "Audio Decoder" related output pin: 0 current input pin: 4 compatible input pins: 3 4
[dshow @ 000001d57618a300]   Crossbar Input pin 0 - "Video Composite" related input pin: 4
[dshow @ 000001d57618a300]   Crossbar Input pin 1 - "S-Video" related input pin: 4
[dshow @ 000001d57618a300]   Crossbar Input pin 2 - "Video Tuner" related input pin: 3
[dshow @ 000001d57618a300]   Crossbar Input pin 3 - "Audio Tuner" related input pin: 2
[dshow @ 000001d57618a300]   Crossbar Input pin 4 - "Audio Line" related input pin: 0

我 运行 进行了一些测试,可以使用以下命令在 yuv420p 和 yuyv422 的各种分辨率下动态捕获和重新编码:

ffmpeg -f dshow -pixel_format yuyv422 -video_size 720x480 -framerate 25 -i video="USB2.0 Grabber":audio="Digital Audio Interface (USB Audio Interface)" -c:v libx264 -crf 18 -aspect 4:3 -vf "yadif=1" -pix_fmt yuv420p -c:a aac -b:a 392k capture.mp4

但是,当我设置 -pixel_format yuyv422 -video_size 720x576 -framerate 25(在设备规格范围内)时,该过程失败并显示 Too many packets buffered for output stream 0:1.。我尝试使用 -rtbufsize 增加缓冲区大小,当进程开始时,视频永远不会被捕获并且帧数在转换时停留在零 - 音频被很好地捕获。

我以为是编码跟不上,但是使用 -vcodec copy 流式传输视频或捕获原始视频提要时我遇到了同样的问题。

使用 VLC 从捕获设备播放仅在使用 720x576 作为大小时播放音频,而较低的分辨率播放正常,这让我认为问题出在设备上或我遗漏了一些特定的 directshow 选项。

有什么想法吗?

我通过将 directshow 视频格式设置为 PAL 选项(默认设置为 NTSC)设法解决了这个问题。我可以从另一个利用 directshow 捕获的应用程序执行此操作,或者直接从 ffmpeg 使用 -show_video_device_dialog true dshow 选项执行此操作,这会导致在转换过程之前出现 GUI。只需要这样做一次,因为设置是粘性的。之后,720x576 的视频就可以正常拍摄了。