如何将 CMSampleBufferRef 转换为 NSData

Posted

技术标签:

【中文标题】如何将 CMSampleBufferRef 转换为 NSData【英文标题】:How to convert CMSampleBufferRef to NSData 【发布时间】:2011-12-18 18:54:16 【问题描述】:

按照 Erik Aigner 在this thread 上的回答,我设法获取了MPMediaItem 的数据,但是数据的类型为CMSampleBufferRef

我知道 CMSampleBufferRef 是一个结构,并在 ios 开发库的 CMSampleBuffer Reference 中定义,但我认为我并不完全理解它是什么。 CMSampleBuffer 函数似乎都不是一个明显的解决方案。

【问题讨论】:

【参考方案1】:

这适用于您正在查看的音频样本缓冲区,如果您想查看整个过程(将所有音频数据从 MPMediaItem 获取到文件中,请查看 this 问题

CMSampleBufferRef ref=[output copyNextSampleBuffer];
        // NSLog(@"%@",ref);
        if(ref==NULL)
            break;
        //copy data to file
        //read next one
        AudioBufferList audioBufferList;
        NSMutableData *data=[[NSMutableData alloc] init];
        CMBlockBufferRef blockBuffer;
        CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(ref, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer);
        // NSLog(@"%@",blockBuffer);



        for( int y=0; y<audioBufferList.mNumberBuffers; y++ )
        
            AudioBuffer audioBuffer = audioBufferList.mBuffers[y];
            Float32 *frame = (Float32*)audioBuffer.mData;


            [data appendBytes:frame length:audioBuffer.mDataByteSize];



        


        CFRelease(blockBuffer);
        CFRelease(ref);
        ref=NULL;
        blockBuffer=NULL;
        [data release];

【讨论】:

非常感谢丹尼尔!像魅力一样工作:) 我还是有点迷茫,对这些东西很菜鸟。 '输出'定义是什么? @jangelo42 检查我在第二行提供的链接(它是一个完整的解决方案,而不仅仅是一个片段),输出是 AVAssetReaderOutput 如何将视频样本转换为NSData @prabhu 它在 for 循环中这样做

以上是关于如何将 CMSampleBufferRef 转换为 NSData的主要内容,如果未能解决你的问题,请参考以下文章

从 CMSampleBufferRef 转换的 UIImage,导致 UIImage 无法正确渲染

iOS音频推流格式转换

iOS视频推流格式转换

iOS音视频采集与格式转换(yuv转rgb)

如何从 CMSampleBufferRef 获取字节,通过网络发送

从 CMSampleBuffer 转换为 UIImage 对象