2011-12-18 127 views
11

如何将CMSampleBufferRef转换为NSData?如何将CMSampleBufferRef转换为NSData

我已成功地通过关注this thread的Erik Aigner的回答得到了MPMediaItem的数据,但数据的类型为CMSampleBufferRef

我知道CMSampleBufferRef是一个结构体,在iOS Dev Library的CMSampleBuffer Reference中定义,但我不认为我完全理解它是什么。 CMSampleBuffer功能似乎都不是一个明显的解决方案。

回答

10

在这里你去这个工程的音频采样缓冲区,是你在找什么,如果你想看看整个过程(正从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]; 
+0

非常感谢丹尼尔!工作就像一个魅力:) – RyanM 2012-01-15 19:24:26

+0

我仍然有点失落,这个东西很noob。什么是'输出'定义为? – jangelo42 2013-02-07 00:25:46

+0

@ jangelo42检查我在第二行提供的链接(它的完整解决方案不只是一个片段),输出是AVAssetReaderOutput – Daniel 2013-02-07 16:37:55