H.264裸流保存为可使用ffplay播放的文件

来源:互联网 发布:js获取滚动条的位置 编辑:程序博客网 时间:2024/06/16 07:42

RTP包封装的H.264,按照一定的方式,还原成H.264文件,是可以直接使用ffplay播放的。但要注意以下问题:

1. 需要了解使用RTP封装H.264的格式,可以参考该文章(着重推荐!!)

2. 每个完整的H.264帧(有时一个RTP包可能会传输多个NALU单元,如type为STAP-A,也有可能遇到一个NALU单元使用多个RTP包传输,如FU-A),都需要使用0x00 00 00 01分开(有些情况下需要使用0x00 00 01分割开,具体什么场景,现在还没搞太清楚吐舌头尴尬)

3. 由于网络传输中MTU的限制,所以一帧数据,可能会使用多个RTP包来传输,也就是遇到FU-A包的处理(我的项目中目前只遇到了FU -A,关于FU-A的描述,请参阅上述推荐文章)。这时帧开始的数据包(即FU-Header的S位为1),写入H.264文件的头,应该时FU-Indicator和FU-Header合成一个字节的NALU头,即将RTP包的第一个字节的前三位(比特)和第二个字节中的后五位(比特)组合成一个字节(Byte);后续再来的RTP数据包(FU-Header的S位为0,和E位为1,即一帧的最后一部分数据)直接将数据写入(即从RTP包payload部分偏移2个字节后)

               将S位为1的RTP包中上述两字节数据合并为一字节 

  后续S位为0的直接将数据部分(不包含FU-Indicator和FU-Header两部分)写入文件

4.对于一个RTP包中,包含多个NALU单元的RTP包(如Type为STAP-A的RTP包),要逐个取出其中的NALU单元,写入文件

          即0x00000001 NALU-1-HDR NALU-1-Data 0x00000001 NALU-2-HDR NALU-2-DATA~~

5.对于一个RTP包中,仅包含一个NALU单元的(Type<24的),只需要先写入一个0x00000001,然后再将RTP中的payload写入即可。

搞了好几天,终于可以使用ffplay播放了。

特别感谢公司Albert New的帮助~~

同时也感谢该文章作者和众多其他网友的资料,谢谢~~

原创粉丝点击