2011-12-18 17 views
11

Come si converte CMSampleBufferRef in NSData?Come convertire CMSampleBufferRef in NSData

Sono riuscito a ottenere i dati per un MPMediaItem seguendo la risposta di Erik Aigner su this thread, tuttavia i dati sono di tipo CMSampleBufferRef.

So che CMSampleBufferRef è una struttura ed è definito nel CMSampleBuffer Reference nella libreria Dev Dev, ma non credo di capire appieno di cosa si tratta. Nessuna delle funzioni CMSampleBuffer sembra essere una soluzione ovvia.

risposta

10

Qui si va questo funziona per tampone campione audio che è quello che si sta guardando, e se si vuole guardare l'intero processo (ottenendo tutti i dati audio da MPMediaItem in un file di controllare il this domanda

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

Grazie mille Daniel! Ha funzionato come un fascino :) – RyanM

+0

Sono ancora un po 'perso e molto noob su questa roba. Cosa si intende per "output"? – jangelo42

+0

@ jangelo42 Controllare il collegamento fornito nella seconda riga (è una soluzione completa non solo un frammento), l'output è AVAssetReaderOutput – Daniel