使用Gstreamer框架将音频和视频同步传输到mp4容器
我是gstreamer的新手,我想从我的主机(Ubuntu PC)向目标板传输一个有音频和视频的mp4视频。 我已成功传输视频。 但是,流式传输(音频和视频)不会发生。
仅传输视频的管道如下所示
发件人:
gst-launch-1.0 -v filesrc location = video.mp4! 解码器! x264enc! rtph264pay! udpsink主机= 192.168.2.136端口= 5000
接收器:
gst-launch-1.0 -v udpsrc port = 5000 caps =“application / x-rtp,media = video,clock-rate = 90000,encoding-name = H264,payload = 96,ssrc = 3394826012,timestamp-offset = 2215812541, seqnum-offset = 46353“! rtph264depay! avdec_h264! videoconvert! ximagesink sync = false
因此,可以看到目标视频。
是否只从MP4文件流式传输音频。
仅传输视频的管道如下所示
发件人:
gst-launch-1.0 -v filesrc location = video.mp4! qtdemux名称= demuxer demuxer。 ! 队列! rtpmp4apay pt = 97! udpsink主机= 192.168.2.69端口= 5000
接收器:
gst-launch-1.0 -v udpsrc port = 5000 caps =“application / x-rtp,media = audio,clock-rate = 44100,encoding-name = MP4A-LATM,cpresent = 0,config = 40002420,payload = 97, ssrc = 3386264266,timestamp-offset = 2822202855,seqnum-offset = 17719“! rtpmp4adepay! 解码器! alsasink&
这也成功运行。
但是,当我在管道下面尝试同时传输音频/视频时:
发件人:
gst-launch-1.0 -v filesrc location = sample.mp4! qtdemux名称= demux解复用器。 ! 队列! rtph264pay pt = 96! udpsink主机= 192.168.3.101端口= 5000 demux。 ! 队列! rtpmp4apay pt = 97! udpsink主机= 192.168.3.101端口= 5001
接收器:
gst-launch-1.0 -v udpsrc port = 5000 caps =“application / x-rtp,media = video,clock-rate = 90000,encoding-name = H264,payload = 96,ssrc = 2226494377,timestamp-offset = 3242004369, seqnum-offset = 17021“! rtph264depay! 解码器! ximagesink udpsrc port = 5001 caps =“application / x-rtp,media = audio,clock-rate = 44100,encoding-name = MP4A-LATM,cpresent = 0,config = 40002420,payload = 97,ssrc = 1499706502,timestamp- offset = 190741668,seqnum-offset = 24774“! rtpmp4adepay! 解码器! alsasink
但是:得到如下输出:
错误:来自元素/ GstPipeline:pipeline0 / GstDecodeBin:decodebin1 / GstFaad:faad0:无法解码流。
失败。 请有人建议我一个管道,可以在目标设备上同步流式传输音频/视频。
提前致谢。
如果您在发送端解复用视频和音频流,则没有简单的方法可以与gstreamer 同步 。 时间戳信息保存在容器中(在这种情况下为MP4),这在解复用时会丢失。
尝试将MP4发送到接收器,然后在那里解复用。 一个基本的例子可以在这里找到:在Ubuntu中使用Gstreamer通过RTP协议流式传输Mp4视频
RTP中的AAC和gstreamer中的其他RTP支付器似乎都存在问题。
正如在另一个答案中提到的,无论如何,如果希望在接收端进行同步播放,最好的策略是不解复用和分割视频和音频。 另外,流式传输的容器格式也可以改善整体功能。
因此,我的建议是将数据流重新转换成MPEG2-TS并通过RTP传输。 这具有几个优点,例如在丢包之后良好的重新同步以及A / V始终保持同步。
例
这适用于我与gstreamer 1.2.4:
寄件人
gst-launch-1.0 -v filesrc location=/foo/bar.mp4 !
qtdemux name=demux demux. ! h264parse config-interval=10 ! queue ! mux.
mpegtsmux name=mux ! rtpmp2tpay ! udpsink host=10.0.0.1 port=5003
demux. ! aacparse ! queue ! mux.
接收器(文件)
gst-launch-1.0 -v udpsrc port=5003 caps="application/x-rtp" !
rtpmp2tdepay ! tsparse ! filesink location=/foo/bar.ts
接收器(输出)
该命令基于问题中的命令,无法使用ALSA进行测试:
gst-launch-1.0 -v udpsrc port=5003 caps="application/x-rtp" !
rtpmp2tdepay ! tsparse ! tsdemux name=demux
demux. ! queue ! audioconvert ! alsasink
demux. ! queue ! xvimagesink
链接地址: http://www.djcxy.com/p/43915.html
上一篇: Streaming audio and video in sync for mp4 container using Gstreamer framework