来自 CMSampleBufferRef 的 NSData 或字节
Posted
技术标签:
【中文标题】来自 CMSampleBufferRef 的 NSData 或字节【英文标题】:NSData or bytes from CMSampleBufferRef 【发布时间】:2013-09-15 11:36:23 【问题描述】:您好,我需要通过网络发送CMSampleBufferRef
。然后客户端通过音频队列服务播放CMSampleBufferRef
。我看过一些关于堆栈溢出的例子,但大多数只是发送缓冲区。但随后一些信息丢失了。我发现[AVAssetReaderOutput copyNextSampleBuffer]
返回了对opaqueCMSampleBuffer
结构的引用。我知道如何获取opaqueCMSampleBuffer
的内存地址,但是如何将地址的内容复制到数组中以便通过网络发送?或者有没有更优雅的方法通过网络发送CMSampleBuffer
。或者我什至可以以某种方式访问opaqueCMSampleBuffer
?
感谢您的时间和帮助
【问题讨论】:
【参考方案1】:以下是从 CMSampleBufferRef 创建 NSData 对象的方法:
在接口(.h)文件中,将样本缓冲区引用添加为属性,同时转换为对象:
@property (nonatomic, strong) __attribute__((NSObject)) CMSampleBufferRef sampleBuffer;
在实现文件(.m)中:
CMSampleBufferRef sampleBuffer = (CMSampleBufferRef)[(AVAssetReaderTrackOutput *)[assetReader 输出][0] copyNextSampleBuffer];
NSPurgeableData *sampleBufferData = (NSPurgeableData *)[self imageToBuffer:sampleBuffer];
要从 NSData 对象访问样本缓冲区,只需使用强制转换:
(CMSampleBufferRef)sampleBufferData;
这是另一种方式:
- (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;
【讨论】:
您能否分享代码 sn-p 以将AVCaptureAudioDataOutput
的 CMSampleBufferRef
转换为 NSData
。以上是关于来自 CMSampleBufferRef 的 NSData 或字节的主要内容,如果未能解决你的问题,请参考以下文章
捕获仍然没有压缩的 UIImage(来自 CMSampleBufferRef)?
如何将 CMSampleBufferRef 转换为 NSData