如何从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从它获取位图数据。 这避免了不必要的复制图像。