不确定这里发生了什么,但我似乎无法使用 ffmpeg 从 HDMI 获得一致的音频同步捕获。我可以从 OBS 获得一致的结果(视频总是提前 100 毫秒左右),即使我在那里设置了相同的一切,但 Linux 上的 OBS 不允许更改输入颜色范围。这是一个已知问题,看起来不会很快得到修复。所以,除非我坚持使用有限范围的视频,否则 OBS 不是首选。OBS 确实支持自定义 ffmpeg 设置,但这些设置似乎只影响输出,而输出本来就已经支持全范围了。我想知道 OBS 在后台用 ffmpeg 做了什么,但我还没有找到查看它的方法。
我的命令中的大部分与问题无关,但最好全部包含。我以前使用 ALSA,但为了与 OBS 保持一致,我已切换到 Pulse。行为似乎相似。我可以尝试将其与同步-itsoffset
,但一旦我设法使同步接近,它就会再次偏离。音频听起来不错,48kHz 的输出采样率与输入匹配。我还将 和 都投入其中,-vsync
正如其他人在线建议的那样。-async
-force_key_frames
ffmpeg -hide_banner -f pulse -async 1 -i default -itsoffset 0 -f v4l2 -vsync 1 -i /dev/video0 -force_key_frames 0 -pix_fmt yuv420p -src_range 1 -dst_range 1 -color_range 2 -framerate 60 -r 60 -video_size 1920x1080 -vf setpts="(PTS-STARTPTS)" -c:v libx264 -c:a flac -crf 12 -dn -sn -map_metadata -1 -preset veryfast -f matroska capture.mkv
以下是我让一个实际上相同的命令运行 26 秒后的日志。它看起来不太好,但我不确定这意味着什么:
https://gofile.io/?c=nEHyj3
正如 Xtoforas 在 Reddit 上所建议的,我尝试使用-use_wallclock_as_timestamps 1
和-copyts
,但没有看到任何改善,-use_wallclock_as_timestamps 1
并且-copyts
破坏了音频,而且可能不是我想要的。
答案1
怀着沉重的心情,我要说,为了这个目的,我将放弃 ffmpeg。前几天又花了几个小时摆弄它,但毫无成果。
OBS 现在适用于流媒体和其他内容。为了捕捉隔行扫描的镜头,我有一个捕捉盒。我看到 madscientist159 提到了 GStreamer,但由于它的学习曲线,我没有尝试过 - Hello World 示例长度为 40 行。