2013-03-19 11 views
13

Aynı anda kayıt ses jakından ses yakalama işleminden geçmem ve aynı zamanda video kaydetme ve kaydetmem gereken bir uygulama geliştiriyorum.CMSampleBufferRef verilerini, ses çıkış jakına geçirin

aurio touch apple örnek kodunu inceledim ve ses geçişlerini gerçekleştirdim.

Ayrıca video kaydını AVCaptureSession üzerinden uyguladım. Her iki işlevin de ayrı ayrı yapılması ve pefectly çalışması.

Ancak, işlevsellik birleştirdiğimde, ses, AVCapturesession'un sesli oturumu nedeniyle çalışmaz.

Ayrıca, AVCaptureSession delege yöntemlerinden edindiğim ses verilerini aktarmaya çalıştım. Aşağıda benim kodum:

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); } 

Ancak hata veriyor. Lütfen mümkün olan en kısa sürede neler yapılabileceğini bildiriniz. Çok fazla dokümana ve kodlara baktım ama herhangi bir çözüm bulamadım. Lütfen yardım edin.

cevap

0

İşte bazı daha iyi hata işleme kodu. Hangi hata dönüyor? Hata açıklamasını dokümanlarda arayarak bulabilirsiniz.

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"); 
} 
İlgili konular