如何从CMSampleBufferRef获取字节,通过网络发送



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从中获取位图数据。这样可以避免不必要地复制图像。

相关内容

  • 没有找到相关文章

最新更新