我是 gstreamer 的新手,我想将一个包含音频和视频的 mp4 视频从我的主机(Ubuntu PC)传输到目标板。我只成功传输了视频。但是流媒体(音频和视频)并没有发生。
仅流式传输视频的管道如下
发件人:
gst-launch-1.0 -v filesrc location = video.mp4 ! decodebin ! x264enc ! rtph264pay ! udpsink host=192.168.2.136 port=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 name=demuxer demuxer. ! queue ! rtpmp4apay pt=97 ! udpsink host=192.168.2.69 port=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 ! decodebin ! alsasink &
这也运行成功。
但是当我尝试在管道下方同步流式传输音频/视频时:
发件人:
gst-launch-1.0 -v filesrc location=sample.mp4 ! qtdemux name=demux demux. ! queue ! rtph264pay pt=96 ! udpsink host=192.168.3.101 port=5000 demux. ! queue ! rtpmp4apay pt=97 ! udpsink host=192.168.3.101 port=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 ! decodebin ! 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 ! decodebin ! alsasink
但是:得到如下输出:
ERROR: from element /GstPipeline:pipeline0/GstDecodeBin:decodebin1/GstFaad:faad0: Could not decode stream.
失败。
请有人建议我一个管道,它可以在目标设备上同步传输音频/视频。
提前致谢。
最佳答案
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
关于video-streaming - 使用 Gstreamer 框架为 mp4 容器同步流式传输音频和视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35843178/