问题 如何将CMSampleBufferRef转换为NSData


你如何将CMSampleBufferRef转换为NSData?

我已经成功获得了数据 MPMediaItem 按照Erik Aigner的回答 这个帖子但是数据是类型的 CMSampleBufferRef

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


2898
2017-12-18 18:54


起源



答案:


在这里,您可以使用音频样本缓冲区,这是您正在查看的内容,如果您想查看整个过程(将所有音频数据从MPMediaItem获取到文件中,请查看 这个 题

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];

10
2017-12-18 23:52



非常感谢Daniel!像魅力一样工作:) - RyanM
我仍然有点失落,非常喜欢这个东西。什么是'输出'定义为? - jangelo42
@ jangelo42检查我在第二行提供的链接(它是一个完整的解决方案而不仅仅是一个片段),输出是AVAssetReaderOutput - Daniel


答案:


在这里,您可以使用音频样本缓冲区,这是您正在查看的内容,如果您想查看整个过程(将所有音频数据从MPMediaItem获取到文件中,请查看 这个 题

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];

10
2017-12-18 23:52



非常感谢Daniel!像魅力一样工作:) - RyanM
我仍然有点失落,非常喜欢这个东西。什么是'输出'定义为? - jangelo42
@ jangelo42检查我在第二行提供的链接(它是一个完整的解决方案而不仅仅是一个片段),输出是AVAssetReaderOutput - Daniel