使用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

下一篇: Gstreamer Record Audio and Video