您好我需要通过网络发送CMSampleBufferRef
。然后,客户端通过音频队列服务播放CMSampleBufferRef
。我已经看到了一些关于堆栈溢出的例子,但是大多数只是发送缓冲区。但是后来有些信息丢失了。我发现[AVAssetReaderOutput copyNextSampleBuffer]
返回对opaqueCMSampleBuffer
结构的引用。我知道如何获取opaqueCMSampleBuffer
的内存地址,但是如何将地址内容复制到数组中以便通过网络发送?或者是否有更优雅的方法通过网络发送CMSampleBuffer
。或者我甚至可以以某种方式访问opaqueCMSampleBuffer
?
感谢您的时间和帮助
答案 0 :(得分:0)
以下是如何从CMSampleBufferRef创建NSData对象:
在接口(.h)文件中,将示例缓冲区引用添加为属性,同时转换为对象:
@property(nonatomic,strong)__ attribute __((NSObject))CMSampleBufferRef sampleBuffer;
在实施文件(.m)中:
CMSampleBufferRef sampleBuffer =(CMSampleBufferRef)[(AVAssetReaderTrackOutput *)[assetReader outputs] [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;
}