GStreamer使用tee元素无法同时播放并录制src0音频至WAV文件
问题分析与解决
原命令的核心问题
你的第一个GStreamer管道存在三个关键错误,直接导致播放失败且生成空文件:
- 冗余无效的解码步骤:录制分支中
alawdec已经输出PCM格式音频,额外添加的decodebin会尝试对PCM做无效解码,直接阻塞分支数据流,进而通过Tee的同步机制拖垮整个管道。 - RTP流的重复消费问题:Tee直接输出原始RTP流,两个分支同时执行
rtppcmadepay和alawdec,会拆分RTP数据包,导致两边都无法完整解析有效音频数据。 - 链路逻辑混乱:你需要保存src0的原始音频,同时播放src0+src1的混合音频,但原管道错误地对RTP流做Tee,而非解码后的PCM流,完全偏离需求逻辑。
修正后的正确命令
gst-launch-1.0 audiomixer name=mixer \ udpsrc name=src0 uri=udp://127.0.0.1:3000 caps="application/x-rtp,media=audio,payload=8,clock-rate=8000,encoding-name=PCMA" ! queue ! rtppcmadepay ! alawdec ! tee name=src0_tee \ src0_tee. ! queue ! mixer.sink_0 \ src0_tee. ! queue ! audioconvert ! wavenc ! filesink location=input.wav \ udpsrc name=src1 uri=udp://127.0.0.1:3010 caps="application/x-rtp,media=audio,payload=8,clock-rate=8000,encoding-name=PCMA" ! queue ! rtppcmadepay ! alawdec ! mixer.sink_1 \ mixer. ! queue ! audioconvert ! audioresample ! audiorate ! volume volume=10.0 ! audiopanorama panorama=0 ! autoaudiosink
修正点说明
- 调整Tee位置:对src0解码后的PCM流做Tee,既可以将PCM发送到混音器参与播放,又可以直接录制原始PCM转WAV,避免RTP流被多分支拆分消费的问题。
- 移除无效解码节点:删掉录制分支的
decodebin,让PCM数据流正常流向WAV编码器。 - 优化队列布局:每个分支独立添加
queue,避免单分支阻塞影响整个管道运行。
内容的提问来源于stack exchange,提问作者Darron
相关产品推荐
相关产品推荐

