基于GStreamer的IP摄像头音视频RTSP管道构建问题求助
处理IP摄像头音视频双流的GStreamer RTSP管道问题
当摄像头仅发送视频流时,以下管道可正常运行:
rtspsrc location=%s latency=0 ! rtph264depay ! h264parse ! video/x-h264,stream-format=byte-stream,alignment=au ! queue ! appsink sync=TRUE emit-signals=TRUE name=appsink-video
但摄像头同时推送音视频流时,管道无法正常工作,以下是两次失败的尝试及问题:
第一次尝试
管道代码:
rtspsrc location=%s name=source ! application/x-rtp,payload=96,media=video ! rtph264depay ! h264parse ! appsink sync=TRUE emit-signals=TRUE name=appsink-video source. ! application/x-rtp,payload=97,media=audio,clock-rate=8000,encoding-name=MPEG4-GENERIC,mode=AAC-hbr ! rtpmp4gdepay ! aacparse ! audio/mpeg,mpegversion=4,stream-format=adts ! queue ! appsink sync=TRUE emit-signals=TRUE name=appsink-audio
出现错误:
DEBUG aacparse gstaacparse.c:306:gst_aac_parse_sink_setcaps:<aacparse0> setcaps: audio/mpeg, mpegversion=(int)4, stream-format=(string)raw ERROR aacparse gstaacparse.c:354:gst_aac_parse_sink_setcaps:<aacparse0> Need codec_data for raw AAC
第二次尝试
管道代码:
rtspsrc location=%s latency=0 ! capsfilter caps=application/x-rtp,media=video,payload=96,encoding-name=H264 ! rtph264depay ! h264parse ! video/x-h264,stream-format=byte-stream,alignment=au ! queue ! appsink sync=TRUE emit-signals=TRUE name=appsink-video rtspsrc location=%s latency=0 ! capsfilter caps=application/x-rtp,media=audio,payload=97,encoding-name=MPEG4-GENERIC,clock-rate=8000,mode=AAC-hbr ! rtpG726depay ! parsebin ! audio/mpeg,mpegversion=4,stream-format=adts ! queue ! appsink sync=TRUE emit-signals=TRUE name=appsink-audio
该尝试同样失败。
环境说明
- 基于Buildroot构建的嵌入式环境,GStreamer配置极简,插件有限
- 无需转码,仅需实现流的隧道传输
解决方案建议
修复音频管道插件错误:第二次尝试误用了
rtpG726depay,你的音频流是MPEG4-GENERIC(AAC),应使用rtpmp4gdepay,与第一次尝试保持一致。解决AAC codec_data缺失问题:
- 跳过
aacparse直接传输:如果仅需隧道传输,不需要解析AAC格式,可直接移除aacparse和audio/mpeg,mpegversion=4,stream-format=adts部分,让rtpmp4gdepay的输出直接进入queue ! appsink。 - 确认SDP携带codec_data:检查摄像头RTSP SDP是否包含AAC配置信息,若存在,
rtspsrc会将其传递给rtpmp4gdepay,此时aacparse可正常工作。可通过gst-launch-1.0 rtspsrc location=... ! fakesink -v查看caps是否包含codec_data字段。
- 跳过
复用单个rtspsrc:避免使用两个
rtspsrc连接同一摄像头,复用同一个rtspsrc的两个分支更高效,还能保证音视频同步。
推荐调整后的管道:
rtspsrc location=%s name=source latency=0 ! application/x-rtp,payload=96,media=video ! rtph264depay ! h264parse ! video/x-h264,stream-format=byte-stream,alignment=au ! queue ! appsink sync=TRUE emit-signals=TRUE name=appsink-video source. ! application/x-rtp,payload=97,media=audio,clock-rate=8000,encoding-name=MPEG4-GENERIC,mode=AAC-hbr ! rtpmp4gdepay ! queue ! appsink sync=TRUE emit-signals=TRUE name=appsink-audio
内容的提问来源于stack exchange,提问作者Luca Olimpio
相关产品推荐
相关产品推荐

