我是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!视频转换! ximagesink sync = false
因此,可以在目标上看到视频。
仅播放来自mp4文件的音频。
仅流视频的流水线如下
发信人:
gst-launch-1.0 -v filesrc location = video.mp4! qtdemux name = demuxer demuxer。 !排队! 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。 !排队! rtph264pay pt = 96! udpsink host = 192.168.3.101 port = 5000 demux。 !排队! 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
但是:获得如下输出:
错误:来自element / GstPipeline:pipeline0 / GstDecodeBin:decodebin1 / GstFaad:faad0:无法解码流。
失败。 请有人建议我使用可在目标设备上同步传输音频/视频的管道。
提前致谢。
答案 0 :(得分:1)
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
答案 1 :(得分:0)
如果您在发送方进行解复用视频和音频流,则没有简单的方法可以将同步与gstreamer一起流式传输。时间戳信息保存在容器中(在这种情况下为MP4),在解复用时会丢失。
尝试将MP4发送到接收器,然后在那里进行解复用。可以在此处找到一个基本示例:Streaming Mp4 video through RTP protocol using Gstreamer in Ubuntu
答案 2 :(得分:0)
发件人
gst-launch-1.0 filesrc location= ~/1.mp4 ! qtdemux 名称=d !队列 ! h264解析! rtph264pay 配置间隔=10 pt=96 ! udpsink 主机=10.24.217.30 端口=5000 d. !队列 !分析! rtpmp4apay pt=97 ! udpsink 主机=10.24.217.30 端口=5001 -v
接收器
gst-launch-1.0 udpsrc port=5000 caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, payload=(int)96, encoding-name=(string) )H264"! rtph264depay !身份无声=0! avdec_h264 !视频转换! ximagesink sync=0 async=0 udpsrc port=5001 caps="application/x-rtp, media=audio, clock-rate=44100, encoding-name=MP4A-LATM, cpresent=0, config=40002420, payload=97, ssrc=1499706502,时间戳偏移=190741668,序列偏移=24774”! rtpmp4adepay ! avdec_aac !身份无声=0! alsasink 同步=0 异步=0
这可以正常工作。
注意: 当发送器启动时,在启动发送器之前尽早启动接收器会在接收器端出错。 ** (gst-launch-1.0:26959): 关键 **: 15:15:51.191: gst_audio_decoder_set_output_format: 断言 'GST_AUDIO_INFO_IS_VALID (info)' 失败 错误:来自元素 /GstPipeline:pipeline0/avdec_aac:avdec_aac0: GStreamer 错误:协商问题。 附加调试信息: gstavauddec.c(449): gst_ffmpegauddec_negotiate (): /GstPipeline:pipeline0/avdec_aac:avdec_aac0: 无法为 libav 解码器 (aac) 设置上限,未修复?
这可能是上限协商中 GST 中的一个错误。 WAR 是在发送者之后启动接收者。