Video streaming 使用Gstreamer框架为mp4容器同步传输音频和视频

Video streaming 使用Gstreamer框架为mp4容器同步传输音频和视频,video-streaming,gstreamer,rtp,libav,Video Streaming,Gstreamer,Rtp,Libav,我是gstreamer的新手,我想流式播放一段mp4视频,这段视频将音频和视频从我的主机(Ubuntu PC)传输到目标板。我只成功地流式传输了视频。但流媒体(音频和视频)并没有发生 仅流式视频的管道如下所示 发件人: gst-launch-1.0-v filesrc location=video.mp4!德克宾!x264enc!RTPH264支付!udpsink主机=192.168.2.136端口=5000 接收人: gst-launch-1.0-v udpsrc port=5000 caps

我是gstreamer的新手,我想流式播放一段mp4视频,这段视频将音频和视频从我的主机(Ubuntu PC)传输到目标板。我只成功地流式传输了视频。但流媒体(音频和视频)并没有发生

仅流式视频的管道如下所示

发件人:

gst-launch-1.0-v filesrc location=video.mp4!德克宾!x264enc!RTPH264支付!udpsink主机=192.168.2.136端口=5000

接收人:

gst-launch-1.0-v udpsrc port=5000 caps=“应用程序/x-rtp,媒体=视频,时钟速率=90000,编码名称=H264,有效负载=96,ssrc=3394826012,时间戳偏移=2215812541,seqnum偏移=46353”!rtph264depay!avdec_h264!视频转换!ximagesink sync=false

因此,可以看到目标上的视频

仅对mp4文件中的音频进行流式传输

仅流式视频的管道如下所示

发件人:

gst-launch-1.0-v filesrc location=video.mp4!qtdemux name=demuxer demuxer!队列rtpmp4apay pt=97!udpsink主机=192.168.2.69端口=5000

接收人:

gst-launch-1.0-v udpsrc port=5000 caps=“应用程序/x-rtp,媒体=音频,时钟速率=44100,编码名称=MP4A-LATM,cpresent=0,配置=40002420,有效负载=97,ssrc=3386264266,时间戳偏移=28222855,序号偏移=17719”!rtpmp4adepay!德克宾!阿尔萨斯银行&

这也是成功的

但当我尝试在管道下方同步传输音频/视频时:

发件人:

gst-launch-1.0-v filesrc location=sample.mp4!qtdemux name=demux demux!队列RTPH264支付点=96!udpsink主机=192.168.3.101端口=5000分接器!队列rtpmp4apay pt=97!udpsink主机=192.168.3.101端口=5001

接收人:

gst-launch-1.0-v udpsrc port=5000 caps=“应用程序/x-rtp,媒体=视频,时钟速率=90000,编码名称=H264,有效负载=96,ssrc=2226494377,时间戳偏移=3242004369,seqnum偏移=17021”!rtph264depay!德克宾!ximagesink udpsrc port=5001 caps=“应用程序/x-rtp,媒体=音频,时钟速率=44100,编码名称=MP4A-LATM,cpresent=0,配置=40002420,有效负载=97,ssrc=1499706502,时间戳偏移=190741668,序号偏移=24774”!rtpmp4adepay!德克宾!阿尔萨斯银行

但是:获得如下输出:

错误:来自元素/GstPipeline:pipeline0/GstDecodeBin:decodebin1/GstFaad:faad0:无法解码流。

失败了。 请有人建议我一个管道,可以流音频/视频都在目标设备上同步


提前感谢。

如果您在发送方端对视频和音频流进行解复用,则无法轻松地与gstreamer同步流。时间戳信息保存在容器中(本例中为MP4),在解复用时丢失


尝试将MP4发送到接收器,然后在那里进行解复用。这里可以找到一个基本示例:

RTP中的AAC以及gstreamer中的其他RTP Payloader似乎存在问题

正如在另一个答案中提到的,如果希望在接收器端进行同步播放,那么无论如何,最好的策略是不对视频和音频进行解复用和分割。此外,可流化的容器格式还可以改进总体功能

因此,我的建议是将数据流重新加载到MPEG2-TS中,并通过RTP进行传输。这有几个优点,如丢包后良好的重新同步以及A/V始终保持同步

例子 这对我来说适用于gstreamer 1.2.4:

发件人 接收器(文件) 接收机(输出) 此命令基于问题中的命令,无法使用ALSA对其进行测试:


谢谢回复,但我能够接收视频,但你们提供的链接对我来说是无用的,因为我需要流音频太多。如果您对如何从mp4流式传输音频有一些想法,请向我建议。因为它显示了解码错误:您是否交叉检查了mp4文件是否包含AAC音频数据(例如,使用ffprob)?应用ffprob时,是的输出为流#0.1(英语):音频:AAC,44100 Hz,立体声,s16,93 kb/s元数据:创建时间:2014-10-28 18:06:24能否请您提供一个只能从mp4流式传输音频的管道。因此,我可以验证音频流是否正确,因为我无法这样做。我可以在没有UDP部分的情况下使其正常工作:!qtdemux name=demux demux!队列假冒伪劣商品!队列rtpmp4apay pt=97!rtpmp4adepay!德克宾!音频转换。。。。但是UDP背后的解码确实有问题。我可以稍后再调查。直接播放视频和音频的接收器端对我不起作用。错误消息或程序输出之类的东西会更有帮助!你好你的例子对我很有用。但只有当我在本地机器上启动服务器和客户端命令时。如果我尝试将视频广播到另一台电脑,我会遇到下一个erorr:`ERROR:from element/GstUDPSrc:source:无法从资源获取/设置设置设置。/GstPlayBin:playbin0/GSTURIDECODEBIN0/GstUDPSrc:source:bind失败:错误绑定到地址:请求的地址在其内部无效。流媒体是怎么回事?JDo,这听起来像是一个无关的问题,你应该用它创建一个新的帖子,包括gstreamer输出等等。
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
gst-launch-1.0 -v udpsrc port=5003 caps="application/x-rtp" ! \
  rtpmp2tdepay ! tsparse ! tsdemux name=demux \
  demux. ! queue ! audioconvert ! alsasink \
  demux. ! queue ! xvimagesink