我是靠谱客的博主 飘逸小鸽子,最近开发中收集的这篇文章主要介绍海思Hi3531||瑞芯微RK1109用rtsp服务器实现h264推流了解RTP包头了解H264的nalu头服务器源码VLC播放成功源码下载,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
海思Hi3531||瑞芯微RK1109用rtsp服务器实现推流
- 了解RTP包头
- 了解H264的nalu头
- 格式一
- 格式二
- 服务器源码
- main函数
- RTSP_PROGRESS_1函数
- EventLoop_1函数
- ScheduleConnections函数调用RtspServer
- RtspServer函数
- RTSP_handler函数
- RTSP_state_machine函数
- schedule1_do函数
- VLC播放成功
- 源码下载
了解RTP包头
一般RTSP流都是以UDP协议为主,每个包的包头(12个字节)我们称为RTP包头
了解H264的nalu头
RTP包的格式一:RTP包头+nalu头(一个字节 )+数据
格式二:RTP包头+fu分包头(两个字节)+数据
格式一
当nalu数据小于等于RTP包最大长度时会采用
nalu头格式:
F:forbidden_zero_bit.1 位,如果有语法冲突,则为 1。当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元。
NRI:nal_ref_idc.2 位,用来指示该NALU 的重要性等级。值越大,表示当前NALU越重要。具体大于0 时取何值,没有具体规定。
Type:5 位,指出NALU 的类型。具体如表所示:
格式二
当nalu数据大于RTP包最大长度时会采用
fu分包头格式:
第一个字节:
跟上面nalu头一样,只是Type=28而已
第二个字节:
S: 1 bit 当设置成1,开始位指示分片NAL单元的开始。当跟随的FU荷载不是分片NAL单元荷载的开始,开始位设为0。
E: 1 bit 当设置成1, 结束位指示分片NAL单元的结束,即, 荷载的最后字节也是分片NAL单元的最后一个字节。
当跟随的FU荷载不是分片NAL单元的最后分片,结束位设置为0。
如果不是首包和尾包S和E设置为0
R: 1 bit
保留位必须设置为0,接收者必须忽略该位。
Type: 5 bits
此处的Type就是NALU头中的Type,取1-23的那个值,表示 NAL单元荷载类型定义
服务器源码
main函数
RTSP_PROGRESS_1函数
EventLoop_1函数
ScheduleConnections函数调用RtspServer
RtspServer函数
这个函数是RTSP服务器处理接收的各种数据并返回数据的过程。如果调用更改函数出现ERR_CONNECTION_CLOSE和ERR_GENERIC这两种错误,会进行一些资源的释放,主要是连接出现问题后的处理。
int RtspServer(RTSP_buffer *rtsp, int rtsp_num)
{
fd_set rset,wset;
/*读写I/O描述集*/
struct timeval t;
int size;
static char buffer[RTSP_BUFFERSIZE+1]; /* +1 to control the final '