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 http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/03_MediaCapture.html#//apple_ref/doc/uid/TP40010188-CH5-SW2
现在我做了以下事情
1.创建videoCaptureDevice
2.创建AVCaptureDeviceInput
并设置videoCaptureDevice
3.创建AVCaptureVideoDataOutput
并实现了委托
4.创建AVCaptureSession
- 将输入设置为 AVCaptureDeviceInput 并将输出设置为 AVCaptureVideoDataOutput
5.在AVCaptureVideoDataOutput委托方法中
-(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 发送。但视频处理有如此延迟。主要是因为 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 连接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)