2011-12-18 12 views
11

Jak przekonwertować CMSampleBufferRef na NSData?Jak przekonwertować CMSampleBufferRef na NSData

Udało mi się uzyskać dane dla MPMediaItem, wykonując odpowiedź Erika Aignera na this thread, jednak dane są typu CMSampleBufferRef.

Wiem, że CMSampleBufferRef jest strukturą i jest zdefiniowany w CMSampleBuffer Reference w bibliotece Dev na iOS, ale nie sądzę, że w pełni rozumiem, co to jest. Żadna z funkcji CMSampleBuffer nie wydaje się być oczywistym rozwiązaniem.

Odpowiedz

10

Tutaj można przejść ten pracuje dla buforu do próbek audio, który jest tym, czego szukasz u, a jeśli chcesz, aby spojrzeć na cały proces (pobieranie wszystkich danych audio z MPMediaItem do pliku sprawdzeniu this pytanie

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

Wielkie dzięki, Daniel! Pracowałam jak amulet :) – RyanM

+0

Nadal jestem trochę zagubiony i bardzo noob na ten temat. Co to jest "wyjście"? – jangelo42

+0

@ jangelo42 Sprawdź łącze i podaj w drugiej linii (pełne rozwiązanie to nie tylko fragment), wyjście to AVAssetReaderOutput – Daniel