GStreamer中RTSP转SRT播放报错“无法识别流类型”的解决方法
解决Gst-play无法识别SRT流的问题
这个报错的核心原因很明确:你当前的RTSP转SRT推流命令没有给视频流添加标准容器封装,而gst-play需要依赖容器格式(比如MPEG-TS)来识别流的类型,所以才会提示"Could not determine type of stream"。
对比你之前能用的videotestsrc推流命令,你会发现当时特意用了mpegtsmux alignment=7把编码后的H264流封装成了MPEG-TS格式,这就是gst-play能正常播放的关键。而现在的RTSP转推命令直接把处理后的raw视频(或者未封装的H264裸流)发给了srtsink,缺少了容器封装这一步。
修正后的推流命令
我们可以优化推流pipeline,避免不必要的解码再编码(直接复用RTSP源的H264流,减少性能损耗),同时添加MPEG-TS封装:
gst-launch-1.0 rtspsrc location=rtsp://localhost:8554/main latency=100 ! queue ! rtph264depay ! h264parse ! mpegtsmux alignment=7 ! queue leaky=downstream ! srtsink uri="srt://:8888" sync=false async=false
各环节说明:
rtph264depay:从RTSP的RTP包中提取原始H264裸流h264parse:解析H264流的结构,生成正确的NALU边界信息,确保后续封装能正常识别mpegtsmux:将H264流封装为MPEG-TS容器(和你之前成功的推流格式一致)
带音频的扩展方案(如果RTSP源包含音频)
如果你的RTSP流同时包含音频,可以把音频流也加入TS封装,比如假设音频是AAC格式:
gst-launch-1.0 rtspsrc location=rtsp://localhost:8554/main latency=100 name=src \ src. ! queue ! rtph264depay ! h264parse ! mpegtsmux name=mux \ src. ! queue ! rtpmp4gdepay ! aacparse ! mux. \ mux. ! queue leaky=downstream ! srtsink uri="srt://:8888" sync=false async=false
(如果音频是其他编码,比如Opus,把rtpmp4gdepay换成rtpopusdepay,aacparse换成opusparse即可)
验证播放
修改推流命令后,直接用你原来的gst-play命令就能正常播放了:
gst-play-1.0 srt://127.0.0.1:8888
内容的提问来源于stack exchange,提问作者Mike05
相关产品推荐
相关产品推荐

