3

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

感谢您的时间和帮助

4

1 回答 1

0

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

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

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

  2. 在实现文件 (.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;
}
于 2016-08-20T07:44:41.237 回答