Qt500行代码实现支持推流的简单RTSPServer

Qt500行代码实现支持推流的简单RTSPServer
项目地址:https://gitee.com/lizhi_zizi/rtspserver_test2
项目总结:
1.RTSP客户端请求推流处理过程
OPTIONS------查询服务器支持的 RTSP 方法(例如 OPTIONS, ANNOUNCE, SETUP, TEARDOWN, RECORD)
ANNOUNCE-----推流会话请求 ,包含SDP信息
SETUP---------约定RTP/RTCP传输使用的端口,使用UDP还是TCP等传输参数
RECORD----------开始推流请求,回复后开启RTP数据接受线程,接收推流过来的数据
TEARDOWN -- ‌终止会话RTSP,关闭RTP/RTCP媒体流通道

2.RTP数据发送规则
数据结构是:RTP数据头+NAL

NAL是H.264/H.265等视频编码标准中的网络适配层,用于封装编码后的数据单元
NAL的几类数据
SEI 补充增强信息 0000000106
SPS 序列参数集 0000000167
PPS 图像参数集 0000000168
IDR图像片 0000000165
非IDR图像片 0000000141

都是00000001开头,后1个字节的值作为标识

3.接收推流数据的处理
这里用ffmpeg推送过来的数据没有00000001的,都是RTP+实际数据,如RTP头+65...
所以在将数据写入到文件时,都要在前面加上或者先写入00000001

3.ffmpeg推流的问题
ffmpeg -i test2.264 -c:v copy -bsf:v h264_mp4toannexb -f rtsp rtsp://127.0.0.1:8554/stream

这个指令执行的推流,可能会把原文件的SPS/PPS/SEI都打包在一个RTP数据包发送过来,需要接收端需要再去解析出来,否则直接缓存下来会导致文件打开播放不了。
这里的处理方式是,这个数据包不写入包缓存文件中,缺的SPS/PPS数据从 ANNOUNCE 会话中的请求中获取,ANNOUNCE请求中包含了SPS/PPS数据,以下即为其中的SPS/PPS数据(sprop-parameter-sets):
sprop-parameter-sets=Z2QAC6zZQgRoQAAAAwBAAAAPA8UKZYA=,aOvjyyLA;

SPS:Z2QAC6zZQgRoQAAAAwBAAAAPA8UKZYA=
PPS:aOvjyyLA
分别进行Base64解码即可获取到对应SPS/PPS数据,再写入到缓存文件中

posted @ 2025-11-30 10:04  lizhizizi  阅读(1)  评论(0)    收藏  举报