GB28181协议支持的H264的PS封装实现
来源:互联网 发布:windows loader3.2.7 编辑:程序博客网 时间:2024/05/16 08:21
1、写在前面:
最开始接触H264的PS封装的时候,参考的是:关于对H264码流的PS的封装的相关代码实现 , 确实是很有帮助,但完全参照这个实现,发现问题也很多,主要还是对MPEG213818的封装协议理解不深产生,所以我们在参考代码实现时,还是需要对原理做深入细致的分析,特别是封装涉及到bit级别的配置,一个bit配错了,可能就播放不了,所以记录下,做个备份。
2、封装需要基本了解的概念:
RTP:是流媒体实时传输协议,RTP头有12个字节
H264视频帧:由NALU单元组成,其中I帧起始是00 00 00 01 65
非I帧 00 00 00 01 41
SPS 00 00 00 01 67
PPS 00 00 00 01 68
根据上面参考文章的说法,I帧前面需要增加PS头+System 头+ System Map 头+ PES 头
非I帧前面增加PS 头 + PES 头
3、对比参考文章做的一些修改:
1、PS封装头的长度是可以变化的,不是固定长度
参考文章中PS头:
- #define PS_HDR_LEN 14
- #define SYS_HDR_LEN 18
- #define PSM_HDR_LEN 24
- #define PES_HDR_LEN 19
我们定义的长度如下:
#define PS_HDR_LEN 14
#define PSM_HDR_LEN 24
#define SYS_HDR_LEN 18
#define PES_HDR_LEN 14
2、关键的PTS和DTS是播放的关键因素,PTS:显示时间戳,DTS:解码时间戳
PTS可以是一个相对值,以90KHZ采样,25fps的视频为例,每帧视频的步长应该为3600
另外:参考文章中PTS的计算和DTS的计算有问题,封装后的视频通过VLC播放时会一闪而过,修改后的函数如下:
3、PES头中,如果只包括PTS时间戳,则需要修改为下面代码:
修改的时候把DTS去掉了,然后配套修改了第8个字节,但没有检查原来参考文章中设置的是同时包括PTS和DTS,所以需要关注修改:第七字节的高两位是PTS和DTS指示位,00表示无PTS无DTS,01禁止使用,10表示PES头部字段会附加PTS结构,11表示PTS和DTS都包括
4、RTP的组包发送上面,根据H264的RTP打包方式,有单NALU、FU-A、FU-B多种形式,根据适配需要调整。
- GB28181协议支持的H264的PS封装实现
- GB28181协议支持的H264的PS封装实现
- 关于对H264码流的PS的封装的相关代码实现
- 关于对H264码流的PS的封装的相关代码实现
- 关于对H264码流的PS的封装的相关代码实现
- 关于对H264码流的PS的封装的相关代码实现
- 关于对H264码流的PS的封装的相关代码实现
- 关于对H264码流的PS的封装的相关代码实现
- 关于对H264码流的PS的封装的相关代码实现
- 一种基于GB28181协议的国标客户端实现
- GB28181协议实现简介
- EasyDarwin支持GB28181协议开发
- EasyDarwin支持GB28181协议开发
- PS封装H264码流
- php支持的协议和封装协议
- H264关于RTP协议的实现
- H264关于RTP协议的实现
- H264关于RTP协议的实现
- 哈希表算法实现
- Linux文件读写机制及优化方式
- Android视频学习(六):广播与服务1
- CodeForces 698B Fix a Tree
- 设计模式--观察者模式
- GB28181协议支持的H264的PS封装实现
- AndroidStudio打包Jar和aar
- html5 图片轮播
- docker镜像仓库的安装(apphouse)
- vim编辑器内的操作
- 配置eclipse中本地约束文件
- Quartz——有状态的job和无状态的job
- PAT 乙级 1004. 成绩排名
- uva820(最大流)