我正在尝试从相机获取视频流并将其显示在iOS应用上。摄像机通过udp端口发送流。为此,我只是打开一个GCDAsyncUDPSocket
并开始收听代表。我的问题在数据开始到来时开始。
我有NSData
对象到达委托,并且由于流是H264并且遵循WWDC2014的信息,我将NSData
剥离成小块,将其分隔为0x000001。这应该是NALU,每个我得到的类型:
- (int)getNALUType:(NSData *)NALU {
uint8_t * bytes = (uint8_t *) NALU.bytes;
return bytes[0] & 0x1F;
}
如果type为7或8,我创建了SPS和PPS对象,当我同时拥有它们时,我使用CMVideoFormatDescriptionCreateFromH264ParameterSets
创建格式描述。
最后,通过格式描述,我开始将类型为1和5的对象(IDR和非IDR图片)添加到AVSampleBufferDisplayLayer
块缓冲区。
我正在使用此处的代码来处理NALU:
https://github.com/niswegmann/H264Streamer/blob/master/H264Streamer/ViewController.m
这就是我处理从流中到达的数据的方式:
-(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext{
UInt8 TxDataBytes[10];
int TxDataIndex = 0;
TxDataBytes[TxDataIndex++] = 0x00;
TxDataBytes[TxDataIndex++] = 0x00;
TxDataBytes[TxDataIndex++] = 0x01;
NSData *NALUStartData = [NSData dataWithBytes:&TxDataBytes length:TxDataIndex];
NSArray* NALUArray = [data componentsSplitByDataBytes:NALUStartData];
for (NSData* NALU in NALUArray) {
[self parseNALU:NALU];
}
}
componentSplitByDataBytes
来自此回购:
https://github.com/watr/NSData-SplitByData
我很确定我的问题是如何从NSData
获取NALU,但我不知道还有什么可以尝试。