Am正在使用AVFoundation框架制作视频。借助Apple文档http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/03_MediaCapture.html%23//apple_ref/doc/uid/TP40010188-CH5-SW2
现在我做了以下事情
1.创建videoCaptureDevice
2.创建AVCaptureDeviceInput
并设置videoCaptureDevice
3.创建AVCaptureVideoDataOutput
并实现Delegate
4.创建AVCaptureSession
-将输入设置为AVCaptureDeviceInput,将输出设置为AVCaptureVideoDataOutput
5.在AVCaptureVideoDataOutput Delegate方法中
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
我得到了CMSamplebuffer并转换成UIImage,并测试使用打印UIImageview
[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];
一切进展顺利。。。。。。。。
我的问题是,我需要通过UDP套接字发送视频帧。尽管以下是我尝试过的坏主意,但UIImage到NSData并通过UDP Pocket发送。BUt在视频处理中出现延迟。主要问题是UIImage到NSDate
所以请给我问题的解决方案
1) 有没有办法将CMSampleBUffer或CVImageBuffer转换为NSData
2) 像音频队列服务和视频队列一样存储UIImage并执行UIImage到NSDate发送???
如果我骑在错误的算法后面请按写方向引导我
感谢提前
以下是获取缓冲区的代码。此代码假定图像为平面(例如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个彩色通道,每秒发送480x360张图像需要4.1Mbps的连接。
使用CMSampleBufferGetImageBuffer
从样本缓冲区中获取CVImageBufferRef
,然后使用CVPixelBufferGetBaseAddress
从中获取位图数据。这样可以避免不必要地复制图像。