NSData或来自CMSampleBufferRef的字节

5

您好,我需要通过网络发送一个CMSampleBufferRef。客户端使用音频队列服务播放CMSampleBufferRef。我在Stack Overflow上看到了一些示例,但大多数示例只是发送缓冲区。但是这样会丢失一些信息。我发现[AVAssetReaderOutput copyNextSampleBuffer]返回对opaqueCMSampleBuffer结构的引用。我知道如何获取opaqueCMSampleBuffer的内存地址,但是如何将地址的内容复制到数组中以便可以通过网络发送?或者是否有更加优雅的方法来发送CMSampleBuffer?或者我甚至可以访问opaqueCMSampleBuffer吗?

感谢您的时间和帮助

1个回答

0

这是如何从CMSampleBufferRef创建一个NSData对象的方法:

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

    @property (nonatomic, strong) __attribute__((NSObject)) CMSampleBufferRef sampleBuffer;

  2. 在实现文件(.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;
}

请问能否提供将 AVCaptureAudioDataOutputCMSampleBufferRef 转换为 NSData 的代码片段? - prabhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接