FFmpeg推RTSP流缺失sprop-parameter-sets:来源与添加方法问询
H.265 RTSP流缺失sprop-parameter-sets的解决办法
一、sprop-parameter-sets的来源
sprop-vps、sprop-sps、sprop-pps说白了就是H.265码流里**VPS(视频参数集)、SPS(序列参数集)、PPS(图像参数集)**的Base64编码结果——这些是解码器解码H.265视频必须的前置配置信息,Android播放器对SDP里的这个字段要求比VLC严格,缺了就会无法播放。
获取这些值有两种常用途径:
- 从原始MP4文件提取:用FFmpeg的trace日志抓取参数集的十六进制数据,再转成Base64。
执行这条命令:
输出里会有类似ffmpeg -i input.mp4 -v trace 2>&1 | grep -E "VPS|SPS|PPS"VPS: 0x40010c01ffff0160000003004000000300000000000000000000000000000的十六进制串,去掉开头的0x后转成Base64,就是对应的sprop值。 - 编码时实时获取:用FFmpeg编码H.265的过程中,编码器会输出这些参数集,你可以在推流前直接捕获处理。
二、给RTSP流添加sprop-parameter-sets的三种方法
1. 让FFmpeg推流时主动写入
修改推流命令,强制FFmpeg把参数集写入RTSP的SDP中:
ffmpeg -re -i input.mp4 -c:v libx265 -x265-params "profile=main" -an -f rtsp -rtsp_transport tcp rtsp://你的rtsp-simple-server地址/流名
如果上面的命令未生效,添加比特流过滤器强制注入:
ffmpeg -re -i input.mp4 -c:v libx265 -x265-params "profile=main" -bsf:v h265_metadata=sprop_present=1 -an -f rtsp -rtsp_transport tcp rtsp://你的rtsp-simple-server地址/流名
2. 配置rtsp-simple-server自动补全
打开rtsp-simple-server的rtsp-simple-server.yml配置文件,找到对应流的paths配置块,加上自动插入sprop的开关:
paths: 你的流名: source: rtsp://你的推流源地址 h265SpropAutoInsert: true
开启这个选项后,服务器会自动从H.265码流中提取VPS/SPS/PPS,转成sprop字段插入到SDP里,Android端就能正常解析了。
3. 用restreamer配置处理
在aler9的restreamer配置里,也能开启参数集自动注入。如果使用配置文件,给H.265流添加对应的处理规则,强制转推时带上sprop信息即可。
三、验证配置是否生效
推流后用ffprobe查看RTSP流的SDP信息,确认是否包含sprop字段:
ffprobe -v quiet -print_format json -show_streams rtsp://你的rtsp-server地址/流名
如果输出的streams->codec_parameters里有extradata,或者直接查看SDP文本里存在sprop-vps、sprop-sps、sprop-pps字段,就说明配置生效。
内容的提问来源于stack exchange,提问作者Naryck
相关产品推荐
相关产品推荐

