Gstreamer USB摄像头音视频AVI文件合成与rtmp推流


之前关于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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值