GStreamer音视频网络流接收合并与splitmuxsink配置求助
解决GStreamer音视频合并传输并生成分段MP4的问题
方案1:基于MPEG-TS复用传输(推荐,简单可靠)
MPEG-TS天生支持多流复用,适合网络传输场景,能保证音视频同步和传输完整性。
发送端命令
将音视频流复用为MPEG-TS后通过UDP发送:
gst-launch-1.0 -v \ videotestsrc ! videoconvert ! x264enc key-int-max=30 tune=zerolatency ! h264parse ! mpegtsmux name=mux \ audiotestsrc ! audioconvert ! audioresample ! avenc_aac bitrate=128000 ! aacparse ! mux. \ mux ! udpsink host=127.0.0.1 port=5000
key-int-max=30:每30帧生成一个关键帧,适配流媒体播放需求tune=zerolatency:优化低延迟传输mpegtsmux:将音视频流打包为单一路MPEG-TS流,简化网络传输逻辑
接收端命令
接收MPEG-TS流,分离音视频后合并生成分段MP4:
gst-launch-1.0 -v -e \ udpsrc port=5000 ! application/x-mpegts ! tsdemux name=demux \ demux.video_0 ! queue ! h264parse ! mp4mux name=mux \ demux.audio_0 ! queue ! aacparse ! mux. \ mux ! splitmuxsink location=/tmp/output-%05d.mp4 max-size-time=1000000000
tsdemux:解析MPEG-TS流,分离出视频(video_0)和音频(audio_0)轨queue:添加缓冲,缓解网络抖动导致的音视频不同步mp4mux:将音视频流合并为标准MP4格式splitmuxsink:按max-size-time=1000000000(1秒)分割生成多个可独立播放的MP4文件
方案2:基于RTP会话多流传输(灵活度更高)
如果需要单独控制音视频的RTP传输参数,可使用rtpbin管理多流会话:
发送端命令
gst-launch-1.0 -v rtpbin name=rtpbin \ videotestsrc ! videoconvert ! x264enc key-int-max=30 tune=zerolatency ! h264parse ! rtph264pay config-interval=1 pt=96 ! rtpbin.send_rtp_sink_0 \ rtpbin.send_rtp_src_0 ! udpsink host=127.0.0.1 port=5000 \ rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5001 sync=false async=false \ udpsrc port=5005 ! rtpbin.recv_rtcp_sink_0 \ audiotestsrc ! audioconvert ! audioresample ! avenc_aac bitrate=128000 ! aacparse ! rtpaacpay pt=97 ! rtpbin.send_rtp_sink_1 \ rtpbin.send_rtp_src_1 ! udpsink host=127.0.0.1 port=5002 \ rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5003 sync=false async=false \ udpsrc port=5006 ! rtpbin.recv_rtcp_sink_1
- 视频流使用端口5000(RTP)、5001/5005(RTCP同步反馈)
- 音频流使用端口5002(RTP)、5003/5006(RTCP同步反馈)
接收端命令
gst-launch-1.0 -v -e rtpbin name=rtpbin \ udpsrc port=5000 caps="application/x-rtp,media=video,clock-rate=90000,encoding-name=H264,payload=96" ! rtpbin.recv_rtp_sink_0 \ rtpbin.recv_rtp_src_0 ! rtph264depay ! h264parse ! queue ! mp4mux name=mux \ udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \ rtpbin.send_rtcp_src_0 ! udpsink host=127.0.0.1 port=5005 sync=false async=false \ udpsrc port=5002 caps="application/x-rtp,media=audio,clock-rate=44100,encoding-name=AAC,payload=97" ! rtpbin.recv_rtp_sink_1 \ rtpbin.recv_rtp_src_1 ! rtpaacdepay ! aacparse ! queue ! mux. \ udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \ rtpbin.send_rtcp_src_1 ! udpsink host=127.0.0.1 port=5006 sync=false async=false \ mux ! splitmuxsink location=/tmp/output-rtp-%05d.mp4 max-size-time=1000000000
- 分别接收音视频RTP流,解封装后合并到
mp4mux,最终生成分段MP4
关键注意事项
- 发送端与接收端的编码格式、RTP caps必须完全匹配,否则会出现流无法解析的问题
splitmuxsink的max-size-time单位为纳秒,1秒对应1000000000- 务必添加
-e参数,确保程序退出时发送EOS信号,生成的MP4文件才能正常播放 queue元素可有效缓解网络抖动导致的音视频不同步问题
内容的提问来源于stack exchange,提问作者Justyoung17
相关产品推荐
相关产品推荐

