您好,我需要通过网络发送CMSampleBufferRef。然后,客户端通过音频队列服务播放CMSampleBufferRef。我已经看到了一些有关堆栈溢出的示例,但大多数示例只是发送缓冲区。但是随后一些信息丢失了。我发现[AVAssetReaderOutput copyNextSampleBuffer]返回对opaqueCMSampleBuffer结构的引用。我知道如何获取opaqueCMSampleBuffer的内存地址,但是如何将地址的内容复制到数组中以便可以通过网络发送它呢?还是有其他更优雅的方法可以通过网络发送CMSampleBuffer。还是可以通过某种方式访问​​opaqueCMSampleBuffer

感谢您的时间和帮助

最佳答案

这是从CMSampleBufferRef创建NSData对象的方法:


在接口(.h)文件中,将样本缓冲区引用作为属性添加,同时转换为对象:

@属性(非原子的,强的)__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;
}

10-07 21:57