2013-03-19 9 views
13

पर CMSampleBufferRef डेटा के माध्यम से पास करें मैं एक ऐप विकसित कर रहा हूं जिसमें मुझे एक ही समय में आउटपुट ऑडियो जैक के माध्यम से ऑडियो कैप्चरिंग से गुजरना होगा और वीडियो को सहेजना होगा।ऑडियो आउटपुट जैक

मैंने ऑरियो टच सेब नमूना कोड देखा है और ऑडियो पासथ्रू लागू किया है।

मैंने AVCaptureSession के माध्यम से वीडियो रिकॉर्डिंग भी लागू की है। व्यक्तिगत रूप से दोनों कार्यक्षमताओं के ऊपर और pefectly काम करता है।

लेकिन जब मैं AVCapturesession के ऑडियो सत्र की वजह से काम नहीं कर रहा कार्यक्षमता ऑडियो पास विलय करता हूं।

मैंने ऑडियो डेटा को पार करने का भी प्रयास किया है जो मुझे AVCaptureSession प्रतिनिधि विधियों से प्राप्त हो रहा है। नीचे मेरा कोड है:

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

लेकिन यह त्रुटि दे रहा है। कृपया सलाह दें कि जितनी जल्दी हो सके आगे क्या किया जा सकता है। मैंने इतने सारे दस्तावेज़ और इतने सारे कोड देखे हैं लेकिन कोई समाधान नहीं मिला। कृपया मदद करें ..

उत्तर

0

यहां कुछ बेहतर त्रुटि हैंडलिंग कोड है। यह क्या त्रुटि देता है? आप दस्तावेज़ में खोज कर त्रुटि विवरण देख सकते हैं।

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"); 
} 
संबंधित मुद्दे