我有一个罗技 C920 网络摄像头,可以提供正确格式的 h264 视频,还有一个连接到 ASUS Xonar 外置 USB 声卡的麦克风。我可以读取两者并将它们的数据混合到一个文件中,如下所示:
gst-launch-1.0 -e \
mp4mux name=muxy ! filesink location=/tmp/out.mp4 \
alsasrc device='hw:Device,0' do-timestamp=true ! audio/x-raw,rate=48000 ! audioconvert ! queue ! lamemp3enc ! muxy.audio_0 \
v4l2src do-timestamp=true ! video/x-h264,framerate=30/1,height=720 ! h264parse ! queue ! muxy.video_0
...但后来我的音频/视频同步不佳。音频流始终以 250 毫秒的垃圾噪声开始,生成的 mp4 视频有 250 毫秒(7 或 8 帧,30 fps)不同步。
似乎源同时启动,但声卡每次插入250ms的初始化垃圾。或者,相机启动时间要长 250 毫秒,但报告流标志的启动不正确。或者,我的设备中的时钟可能由于某种原因不同步。我不知道如何找出这些(和其他)潜在根本原因之间的区别。
不管是什么原因,我至少想修补这些症状。我一直在尝试在 gstreamer 管道中执行以下任何操作,其中任何一个都可以满足我的要求:
- 剪掉前 250 毫秒的音频
- 将视频延迟 250 毫秒或 7 帧
- 使用 alsasrc slave-method 或 v4l2src io-mode 等属性正确同步音频和视频时间戳
而且我显然做错了。没有任何效果。无论如何,我总是让视频在音频之前运行 250 毫秒/7 帧。据报道,添加队列元素修复了同步问题,因为 mediainfo 现在报告音频和宽频的持续时间值在 20 毫秒内,这是可以接受的。但这并不是最终视频的实际工作方式。拍拍我的手,噪音来晚了。
这可以在后期处理中修复,但为什么不直接从 gst 管道避免麻烦并正确处理呢?我已经没有技巧了,只是准备回退到手动修复每个视频的同步。有什么想法吗?
感谢您提供任何帮助、提示和想法。