如何使用Gstreamer将树莓派实时音视频封装为MPEG-TS流供VLC局域网播放
错误原因
你遇到的not-negotiated报错是音频采集到复用的链路缺少格式适配元件,导致上下游元件的输入输出格式无法匹配导致的,与麦克风本身的硬件兼容性无关。
修复后的可运行脚本
#!/bin/bash dstAdr=${1:-192.168.0.255} raspivid -n -w 640 -h 480 -fps 20 -b 2000000 -a 12 -t 0 -o - \ | gst-launch-1.0 -e -v fdsrc \ ! video/x-h264, width=640, height=480, framerate=20/1 \ ! h264parse config-interval=-1 \ ! mpegtsmux name=mux \ ! udpsink host=$dstAdr port=5004 \ alsasrc device=hw:1,0 \ ! audio/x-raw, channels=1, rate=44100 \ ! audioconvert \ ! audioresample \ ! queue max-size-buffers=0 max-size-time=0 max-size-bytes=0 \ ! lamemp3enc target=1 bitrate=64 cbr=true \ ! mp3parse \ ! mux.
修改说明:
- 音频链路新增
audioconvert、audioresample元件,适配不同硬件输出的原始音频格式,满足编码器输入要求 - MP3编码后新增
mp3parse元件,对齐mpegtsmux的输入格式要求 - 移除多余的
rtpmp2tpay封装,保持和原有纯视频流的播放地址兼容,局域网设备仍可通过udp://@:5004直接用VLC播放 - 调整queue参数避免音频缓存导致的音画不同步
疑问解答
alsasrc是否需要额外添加明确配置参数?
你当前配置的设备号、声道数、采样率参数已经满足要求,不需要额外新增alsasrc配置项,报错和alsasrc本身的配置无关。- 使用Gstreamer命令行工具是否可以实现两路实时流复用为单一流?
完全可以,你原有的流水线结构逻辑是正确的,仅缺少中间适配元件,上述修复后的命令即可直接实现音视频流合并输出。 - 该需求是否可以通过Gstreamer C API实现?
可以,Gstreamer命令行本质是对C API的上层封装,所有命令行可实现的流水线功能都可以通过C API实现,还可额外扩展运行时参数调整、异常自动重启、流控优化等自定义功能。
内容的提问来源于stack exchange,提问作者thatjames
相关产品推荐
相关产品推荐

