在 gst-launch-1.0 中进行 mp4muxing 时同步音频和视频

And*_*und 5 audio video gstreamer gst-launch

我有一个罗技 C920 网络摄像头,可以提供格式正确的 h264 视频,以及一个连接到华硕 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
Run Code Online (Sandbox Code Playgroud)

...但后来我的音频/视频同步很差。音频流始终以 250 毫秒的垃圾噪声开始,生成的 mp4 视频有 250 毫秒(7 或 8 帧,30 帧)不同步。

好像是源同时启动,但是声卡每次插入250ms的初始化垃圾。或者,相机需要 250 毫秒的时间才能启动,但会报告错误的流开始标志。或者,由于某种原因,我的设备中的时钟可能不同步。我不知道如何找出这些(和其他)潜在根本原因之间的区别。

不管是什么原因,我想至少弥补这些症状。我一直在尝试在 gstreamer 管道中执行以下任何操作,其中任何一个都可以满足我的要求:

  • 剪掉前 250 毫秒的音频
  • 将视频延迟 250 毫秒或 7 帧
  • 使用 alsasrc slave-method 或 v4l2src io-mode 等属性正确同步音频和视频时间戳

而我显然做错了。什么都行不通。无论如何,我总是以比音频早 250 毫秒/7 帧的速度结束视频。据报道,添加队列元素修复了同步问题,因为 mediainfo 现在报告音频和 Wideo 的持续时间值彼此在 20 毫秒内,这是可以接受的。但这并不是生成的视频的实际工作方式。拍拍手,声音来晚了。

这可以在后期处理中解决,但为什么不直接从 gst 管道中避免麻烦并正确处理呢?我已经完全没有技巧了,正准备回退到手动修复每个视频的同步。有什么想法吗?

感谢您提供任何帮助、提示和想法。