来自CMSampleBufferRef的NSData或字节

时间:2013-09-15 11:36:23

标签: objective-c avfoundation audioqueueservices cmsamplebufferref

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

感谢您的时间和帮助

1 个答案:

答案 0 :(得分: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];

  3. 要从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;
    }