您的位置:首页 > 移动开发 > IOS开发

iOS RTMP 视频直播开发笔记(5)------- iOS H.264 实时硬编码实现原理

2016-06-06 15:22 811 查看


网上有两个实现,GDCL
– AVEncoder 和 IFVideoPicker

IFVideoPicker 使用发现还有些问题,例如视频帧不连续(丢帧),简单调试后由于时间原因放弃,选择使用
AVEncoder
。不过其项目中有不少关于
MP4 和 FLV 文件格式处理的相关细节,值得看看。

这里谈下它们的实现原理:想要采用硬件加速编码视频,苹果提供的只有 
AVAssetWriter
 类,而它只能写入编码后的文件到指定路径的文件中。我们如果想要实时硬编码,例如将视频流输出到网络,这时就需要从输出文件中不断读取新的编码后视频数据。

从代码上看,
AVEncoder
 通过使用
GCD
Dispatch Source
监听文件的内容改变,通过此方式高效的读取编码后的数据,然而简单的读取 raw data 并不能满足我们的需求,因此在代码中根据Mp4的文件结构(要看懂这里就需要前面介绍的知识了),每次读取一个完整的
NALU
后再将数据通过
block 传递给外部调用者处理。

AVEncoder -> 读入CMBuffer -> 调用
AVAssetWriter
编码Buffer
-> 设置 header 的 FileHandler -> 获得第一帧(moov[sps, pps]),切换写入文件(寻找mdat),重设FileHandle -> [输入数据 -> 编码 处理循环 ] -> 发送给调用者处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  视频