You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GStreamer生成的HLS(.ts)无音频问题排查(H264+Opus转MPEG2-TS)

问题分析

从你的GStreamer输出日志可以看到,完全没有音频相关元素的初始化或数据流日志,结合管道代码来看,核心问题有两个:

  1. 接收管道语法错误:视频分支的hlssink行末尾缺少反斜杠\,导致音频分支被当成独立的命令参数,根本没有加入到主管道中,音频流完全没进入处理流程。
  2. 音频编码/解码的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.ts
    
    用ffplay test-audio.ts播放,确认有音频。

内容的提问来源于stack exchange,提问作者jhthompson12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:25:37