布景
解码器运用VideoToolBox
硬解码。
H264是annex-b
格局,以0x00000001
作为开始码,h264数据结构。
用CocoaAsyncSocket
树立TCP连接,接纳H264数据。
待解决的问题
现在TCP每次传输过来的数据,有可能是0.5条,虽然以0x00000001开头,可是数据不完好。
有可能是1.5条、2条等。
那么就需要将每次传输过来的数据,拆分成1条1条完好的数据给解码器。
解决进程
刚开始的时候,我就单纯的用一个大数组,将所有的数据存起来,然后遍历分割保存到数组,最终遍历取出分割好的数据给解码器。虽然逻辑上说得通,可是功率很低,数据量太大特别消耗CPU、内存,最终由于太卡顿放弃了。
然后我就找有没有人也用tcp获取数据解析,终于找到一个答案。
提供了CocoaAsyncSocket
一个很关键的办法:
- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag
读取到某个位置截止,那么我只需要读取到开始码0x00000001就可以实现数据分割了。
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条数据,第二条不完好
// 用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
最终将切分好的数据,给解码器就可以了。
总结
- h264原始数据,需要切割才能给解码器
- 运用
CocoaAsyncSocket
的readData
可以简化切割