jju*_*9jj 5 objective-c avfoundation audioqueueservices cmsamplebufferref
CMSampleBufferRef您好,我需要通过网络发送。然后客户端CMSampleBufferRef通过音频队列服务播放该音频。我见过一些关于堆栈溢出的例子,但大多数只是发送缓冲区。但随后一些信息就会丢失。我发现它[AVAssetReaderOutput copyNextSampleBuffer]返回一个结构体的引用opaqueCMSampleBuffer。我知道如何获取 的内存地址opaqueCMSampleBuffer,但是如何将地址的内容复制到数组中以便可以通过网络发送它?或者有没有更优雅的方法通过CMSampleBuffer网络发送。或者我什至可以以某种方式访问opaqueCMSampleBuffer?
感谢您的时间和帮助
以下是从 CMSampleBufferRef 创建 NSData 对象的方法:
在接口 (.h) 文件中,添加示例缓冲区引用作为属性,同时转换为对象:
@property (非原子,强) __attribute__((NSObject)) CMSampleBufferRef SampleBuffer;
在实现文件(.m)中:
CMSampleBufferRef 样本缓冲区 = (CMSampleBufferRef)[(AVAssetReaderTrackOutput *)[assetReader 输出][0] copyNextSampleBuffer];
NSPurgeableData *sampleBufferData = (NSPurgeableData *)[self imageToBuffer:sampleBuffer];
要从 NSData 对象访问示例缓冲区,只需使用强制转换:
(CMSampleBufferRef)sampleBufferData;
Run Code Online (Sandbox Code Playgroud)
这是另一种方法:
- (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;
}
Run Code Online (Sandbox Code Playgroud)