如何从CMSampleBufferRef获取字节,通过networking发送
我正在使用AVFoundation框架捕获video。借助Apple文档http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/03_MediaCapture.html%23//apple_ref/doc/ UID / TP40010188-CH5-SW2
现在我做了以下的事情
1.创buildvideoCaptureDevice
2.创buildAVCaptureDeviceInput
并设置videoCaptureDevice
3.创buildAVCaptureVideoDataOutput
并实现Delegate
4.创buildAVCaptureSession
– 将input设置为AVCaptureDeviceInput并将输出设置为AVCaptureVideoDataOutput
5.在AVCaptureVideoDataOutput委托方法
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
我得到了CMSamplebuffer和转换成UIImage并testing打印UIImageview使用
[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
每一件事情都做得很好……..
我的问题是,我需要通过UDP套接字发送video帧。即使以下一个是不好的主意,我试过,UIImage NSData和通过UDP口袋发送。 BUt在video处理中得到如此的延迟。因为UIImage对NSDate的问题最重要
所以请给我解决scheme对于我的问题
1)任何方式来将CMSampleBUffer或CVImageBuffer转换为NSData?
2)像audio队列服务和video队列存储UIImage和做UIImage NSDate和发送?
如果骑在错误的algorithm后面,请在写入方向上引导我
提前致谢
这里是获取缓冲区的代码。 这段代码假设一个平面图像(例如BGRA)。
NSData* imageToBuffer( CMSampleBufferRef source) { CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(source); CVPixelBufferLockBaseAddress(imageBuffer,0); size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); size_t width = CVPixelBufferGetWidth(imageBuffer); size_t height = CVPixelBufferGetHeight(imageBuffer); void *src_buff = CVPixelBufferGetBaseAddress(imageBuffer); NSData *data = [NSData dataWithBytes:src_buff length:bytesPerRow * height]; CVPixelBufferUnlockBaseAddress(imageBuffer, 0); return [data autorelease]; }
更有效的方法是使用NSMutableData或缓冲池。
假设3个颜色通道,每秒发送480×360图像将需要4.1Mbps连接。
使用CMSampleBufferGetImageBuffer
从样本缓冲区获取CVImageBufferRef
,然后使用CVPixelBufferGetBaseAddress
从它获取位图数据。 这避免了不必要的复制图像。