文章目录
之前关于Gstreamer的文章要么只操作音频,要么只操作视频,现在需要同时操作音视频,分别完成音视频文件合成与推流。
gstreamer音视频同步问题
读取USB摄像头的音频数据文章中使用Gstreamer命令行工具,合成的AVI音视频文件在播放时音视频不同的问题现已查明。
gst-launch-1.0 -e avimux name=mux1 ! filesink location=test.avi \ v4l2src device=/dev/video0 ! video/x-h264, framerate=30/1, width=640, height=360 ! mux1. \ alsasrc device=hw:2,0 ! audio/x-raw, rate=32000, channels=2, layout=interleaved, format=S16LE ! mux1.
此命令行合成的音视频AVI文件播放不同步,原因如下:
- 此命令行生成的管道在avimux元件之前有两个数据源,分别是音频数据、视频数据
- 音频数据的生成速度与H264视频数据的生成速度不一致
- 在进行AVI文件合成时,数据的消耗速率不一致
由以上原因导致合成的AVI音视频文件在播放时视频部分与音频部分不同步。
解决方法是分别在音频、视频数据流中增加一个queue
元件,此元件在gstreamer中会创建一个队列,并将元件前后的数据处理用多线程的方式完成,并会根据各自数据的消耗速率来进行同步,这样就可以完成音视频文件合成的同步。
合成可同步播放的AVI文件
Ubuntu16.04 PC平台操作示例
首先通过arecord -l
命令查看USB摄像头生成的音频设备文件
card 1: C920 [HD Pro Webcam C920], device 0: USB Audio [USB Audio] 子设备: 1/1 子设备 #0: subdevice #0
因此USB的音频设备为hw:1,0
Gstreamer合成AVI音视频文件的命令如下:
gst-launch-1.0 -e avimux name=mux1 ! filesink location=test.avi v4l2src device=/dev/video0 ! video/x-h264, framerate=30/1, width=640, height=360 ! queue ! mux1. alsasrc device=hw:1,0 ! audio/x-raw, rate=32000, channels=2, layout=interleaved, format=S16LE ! queue ! mux1.
此命令直接读取USB摄像头的视频H264帧、音频裸数据(pcm数据)合称为AVI文件,
由于以上命令中音频数据未经过编码压缩,因此合成后的AVI文件偏大,可以在命令中加入音频编码元件,将音频编码为MP3&#x