iOS h264解码前数据处理

背景

解码器使用VideoToolBox硬解码。

H264是annex-b格式,以0x00000001作为起始码,h264数据结构

CocoaAsyncSocket建立TCP连接,接收H264数据。

待解决的问题

目前TCP每次传输过来的数据,有可能是0.5条,虽然以0x00000001开头,但是数据不完整。 有可能是1.5条、2条等。

那么就需要将每次传输过来的数据,拆分成1条1条完整的数据给解码器。

解决过程

刚开始的时候,我就单纯的用一个大数组,将所有的数据存起来,然后遍历分割保存到数组,最后遍历取出分割好的数据给解码器。虽然逻辑上说得通,但是效率很低,数据量太大特别耗费CPU、内存,最终因为太卡顿放弃了。

然后我就找有没有人也用tcp获取数据解析,终于找到一个答案

提供了CocoaAsyncSocket一个很关键的方法:

ObjectiveC 复制代码
- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag

读取到某个位置截止,那么我只需要读取到起始码0x00000001就可以实现数据分割了。

Swift 复制代码
let startCode: [UInt8] = [0,0,0,1]

func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {

    socket.readData(to: Data(startCode), withTimeout: -1, tag: 0)
}

func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {   
    socket.readData(withTimeout: -1, tag: 0)
}

第一次获取到的数据

有1.5条数据,第二条不完整

arduino 复制代码
// 用10进制表示获取到的byte数组
0,0,0,1,2,3,4,5,6,0,0,0,1,8,4,5,6,7,7.....

第二条获取到的数据

有0.5条数据,需要和第一次获取的第二条数据合并成完整数据。

复制代码
9,9,4,3,2,0,0,0,1

第三条及以后获取到的数据

都是以起始码结尾的数据,只需要将起始码拼接到前面就是完整的数据。

复制代码
9,3,4,5,6,3,2,3,5,2,3,4,5,2,3,4,5,5,4,3,2,4,2,2,.....0,0,0,1

最后将切分好的数据,给解码器就可以了。

总结

  1. h264原始数据,需要切割才能给解码器
  2. 使用CocoaAsyncSocketreadData可以简化切割
相关推荐
Tiny_React20 小时前
使用 Claude Code Skills 模拟的视频生成流程
人工智能·音视频开发·vibecoding
hk112410 天前
【音视频/边缘计算】2025年度H.265/HEVC高并发解码与画质修复(Super-Resolution)基准测试报告(含沙丘/失控玩家核心样本)
ffmpeg·边缘计算·音视频开发·h.265·测试数据集
李小轰_Rex20 天前
把手机变成听诊器!摄像头 30 秒隔空测心率 - 开箱即用
android·音视频开发
李小轰_Rex21 天前
纯算法AEC:播录并行场景的回声消除实战笔记
android·音视频开发
否子戈21 天前
WebCut前端视频编辑UI框架一周开源进度
前端·音视频开发·ui kit
SHERlocked9325 天前
摄像头 RTSP 流视频多路实时监控解决方案实践
c++·后端·音视频开发
mortimer1 个月前
Python + FFmpeg 视频自动化处理指南:从硬件加速到精确剪辑
python·ffmpeg·音视频开发
否子戈1 个月前
做中国人自己的视频编辑UI框架,WebCut正式开源
前端框架·音视频开发·视频编码
音视频牛哥1 个月前
从低延迟到高可用:RTMP与 HTTP/HTTPS-FLV在App播放体系中的角色重构
人工智能·音视频·音视频开发·http-flv播放器·https-flv播放器·ws-flv播放器·wss-flv播放器
音视频牛哥2 个月前
轻量级RTSP服务的工程化设计与应用:从移动端到边缘设备的实时媒体架构
人工智能·计算机视觉·音视频·音视频开发·rtsp播放器·安卓rtsp服务器·安卓实现ipc功能