2013-03-19 8 views
13

Pracuję nad jedną aplikacją, w której muszę przechodzić przez przechwytywanie audio przez wyjściowe gniazdo audio w tym samym czasie nagrywać i zapisywać wideo.Przechodzenie przez dane CMSampleBufferRef do gniazda wyjściowego audio

Sprawdziłem kod przykładowy jabłka aurio touch i zaimplementowałem przekazywanie dźwięku.

Mam również zaimplementowane nagranie wideo przez AVCaptureSession. Powyższe funkcje funkcjonują indywidualnie i działają perfekcyjnie.

Ale po scaleniu funkcji przejścia audio przez nie działa z powodu sesji audio z AVCapturesession.

Próbowałem również przekazać dane audio, które otrzymuję z metod delegatów AVCaptureSession. Poniżej znajduje się mój kod:

OSStatus err = noErr; 


AudioBufferList audioBufferList; 
CMBlockBufferRef blockBuffer; 
CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer); 
CMItemCount numberOfFrames = CMSampleBufferGetNumSamples(sampleBuffer); // corresponds to the number of CoreAudio audio frames 

currentSampleTime += (double)numberOfFrames; 

AudioTimeStamp timeStamp; 
memset(&timeStamp, 0, sizeof(AudioTimeStamp)); 
timeStamp.mSampleTime = currentSampleTime; 
timeStamp.mFlags |= kAudioTimeStampSampleTimeValid; 

AudioUnitRenderActionFlags flags = 0; 
aurioTouchAppDelegate *THIS = (aurioTouchAppDelegate *)[[UIApplication sharedApplication]delegate]; 
err = AudioUnitRender(self.rioUnit, &flags, &timeStamp, 1, numberOfFrames, &audioBufferList); 

if (err) { printf("PerformThru: error %d\n", (int)err); } 

Ale to daje błąd. Proszę doradzić, co można zrobić dalej, tak szybko, jak to możliwe. Zajrzałem do tak wielu dokumentów i tak wielu kodów, ale nie mogłem znaleźć żadnego rozwiązania. Proszę pomóc ..

Odpowiedz

0

Oto trochę lepszy kod obsługi błędów. Jaki błąd powraca? Możesz sprawdzić opis błędu, wyszukując go w dokumentacji.

static void CheckError (OSStatus error, const char *operation) { 
    if (error == noErr) return; 

    char str[20] = {}; 
    // see if it appears to be a 4 char code 
    *(UInt32*)(str + 1) = CFSwapInt32HostToBig(error); 
    if (isprint(str[1]) && isprint(str[2]) && isprint(str[3]) && isprint(str[4])) { 
     str[0] = str[5] = '\''; 
     str[6] = '\0'; 
    } else { 
     sprintf(str, "%d", (int)error); 
    } 

    fprintf(stderr, "Error: %s(%s)\n", operation, str); 
    exit(1); 
} 

- (void)yourFunction 
{ 
    AudioBufferList audioBufferList; 
    CMBlockBufferRef blockBuffer; 
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, NULL, &audioBufferList, sizeof(audioBufferList), NULL, NULL, 0, &blockBuffer); 
    CMItemCount numberOfFrames = CMSampleBufferGetNumSamples(sampleBuffer); // corresponds to the number of CoreAudio audio frames 

    currentSampleTime += (double)numberOfFrames; 

    AudioTimeStamp timeStamp; 
    memset(&timeStamp, 0, sizeof(AudioTimeStamp)); 
    timeStamp.mSampleTime = currentSampleTime; 
    timeStamp.mFlags |= kAudioTimeStampSampleTimeValid; 

    AudioUnitRenderActionFlags flags = 0; 
    aurioTouchAppDelegate *THIS = (aurioTouchAppDelegate *)[[UIApplication sharedApplication]delegate]; 
    CheckError(AudioUnitRender(self.rioUnit, &flags, &timeStamp, 1, numberOfFrames, &audioBufferList), 
       "Error with AudioUnitRender"); 
} 
Powiązane problemy