GStreamer生成的HLS(.ts)无音频问题排查(H264+Opus转MPEG2-TS)
问题分析
从你的GStreamer输出日志可以看到,完全没有音频相关元素的初始化或数据流日志,结合管道代码来看,核心问题有两个:
- 接收管道语法错误:视频分支的
hlssink行末尾缺少反斜杠\,导致音频分支被当成独立的命令参数,根本没有加入到主管道中,音频流完全没进入处理流程。 - 音频编码/解码的Caps协商问题:强制指定
opusdec的采样率可能导致协商失败,且voaacenc输出未明确AAC格式,aacparse无法正确识别流格式。
修复方案
1. 修正接收端管道(核心修复)
修复语法错误,同时优化音频流的Caps协商和编码流程:
VIDEO_CAPS="application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264,payload=(int)96" AUDIO_CAPS="application/x-rtp,media=(string)audio,clock-rate=(int)48000,encoding-name=(string)OPUS" gst-launch-1.0 -v \ udpsrc address=224.1.1.1 port=5001 caps=$VIDEO_CAPS \ ! queue \ ! rtph264depay \ ! h264parse \ ! mpegtsmux name=mux \ ! hlssink location="/var/www/picam-viewer/hls/%06d.ts" playlist-location="/var/www/picam-viewer/hls/list.m3u8" max-files=5 playlist-length=1 target-duration=5 \ udpsrc address=224.1.1.1 port=5002 caps=$AUDIO_CAPS \ ! queue \ ! rtpopusdepay \ ! opusdec # 移除强制Caps,让GStreamer自动协商 ! audioconvert \ ! audioresample \ ! voaacenc bitrate=128000 # 指定AAC比特率,提升音质 ! audio/mpeg,mpegversion=4,stream-format=raw # 明确AAC格式,帮助aacparse识别 ! aacparse \ ! mux.
2. 优化发送端音频管道(确保流格式匹配)
显式指定rtpopuspay的时钟率,和接收端的Caps保持一致:
gst-launch-1.0 -v rpicamsrc vflip=true hflip=true \ name=src preview=0 fullscreen=0 bitrate=10000000 \ annotation-mode=time annotation-text-size=20 \ ! video/x-h264,width=960,height=540,framerate=24/1 \ ! h264parse \ ! rtph264pay config-interval=1 pt=96 \ ! queue max-size-bytes=0 max-size-buffers=0 \ ! udpsink host=224.1.1.1 port=5001 auto-multicast=true \ alsasrc device=plug:dsnooped provide-clock=false \ ! audio/x-raw,rate=16000 \ ! audiorate \ ! audioconvert \ ! audioresample \ ! opusenc \ ! rtpopuspay clock-rate=48000 # 显式指定时钟率,匹配接收端Caps ! queue max-size-bytes=0 max-size-buffers=0 \ ! udpsink host=224.1.1.1 port=5002 auto-multicast=true
排查验证步骤
如果修复后仍有问题,可分步验证:
- 单独测试音频流接收:确认发送端音频流正常:
能听到声音则说明发送端音频流无问题。gst-launch-1.0 udpsrc address=224.1.1.1 port=5002 caps=$AUDIO_CAPS ! rtpopusdepay ! opusdec ! audioconvert ! autoaudiosink - 测试音频转AAC后写入TS:替换
hlssink为filesink,检查生成的TS文件是否包含音频:
用gst-launch-1.0 udpsrc address=224.1.1.1 port=5002 caps=$AUDIO_CAPS ! rtpopusdepay ! opusdec ! audioconvert ! audioresample ! voaacenc bitrate=128000 ! audio/mpeg,mpegversion=4,stream-format=raw ! aacparse ! mpegtsmux ! filesink location=test-audio.tsffplay test-audio.ts播放,确认有音频。
内容的提问来源于stack exchange,提问作者jhthompson12
相关产品推荐
相关产品推荐

