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的帮助~~
同时也感谢该文章作者和众多其他网友的资料,谢谢~~
- H.264裸流保存为可使用ffplay播放的文件
- wireshark如何把rtp包保存为ts流的可播放文件
- h.264視頻編碼加生成QT7可播放的mp4文件
- ffplay播放文件
- WindowsPhone 7播放H.264裸流文件的实现
- FFmpeg取回标准H.264流后播放的同时存为MP4文件
- h.264视频编码加生成QT7可播放的mp4文件
- 使用Python脚本将酷狗音乐的缓存文件修改为可播放
- ffplay播放yuv文件命令
- ubuntu 下 利用ffplay 播放 yuv 格式的文件
- 第一次用ffplay播放视频的过程以及ffplay使用说明书
- 使用ffplay播放USB设备时的频道选择
- GStreamer生成可播放的.264文件
- h.264保存flv文件
- ffplay播放器移植VC的工程:ffplay for MFC
- ffplay播放器移植VC的工程:ffplay for MFC
- ffplay播放器移植VC的工程:ffplay for MFC
- ffplay播放器移植VC的工程:ffplay for MFC
- 30.Oracle杂记——Oracle常用动态视图v$session
- 使用++,--
- 一致hash
- CSS——background系列属性
- Palindrome Linked List
- H.264裸流保存为可使用ffplay播放的文件
- java基本数据类型对象包装类
- 31.Oracle杂记——Oracle常用动态视图v$sesstat
- Uva-674 Coin Change (完全背包 入门题)
- Swift循环之 for-in
- 模拟密码管理箱
- java创建线程的三种方式简要。
- 总结
- 深度学习之从零带你入门(扫盲篇)