2013-03-19 38 views
13

Tôi đang phát triển một ứng dụng mà tôi cần phải chuyển qua thu âm qua đầu cắm âm thanh đầu ra tại cùng một bản ghi thời gian và lưu video.Chuyển qua dữ liệu CMSampleBufferRef tới đầu ra âm thanh

Tôi đã xem xét mã mẫu táo cảm ứng aurio và thực hiện chuyển qua âm thanh.

Tôi cũng đã triển khai quay video qua AVCaptureSession. Trên cả hai chức năng được thực hiện riêng lẻ và hoạt động tốt.

Nhưng khi tôi hợp nhất âm thanh chức năng truyền qua không hoạt động do phiên âm thanh của AVCapturesession.

Tôi cũng đã cố gắng chuyển dữ liệu âm thanh mà tôi nhận được từ AVCaptureSession phương thức ủy quyền. Dưới đây là mã của tôi:

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

Nhưng nó bị lỗi. Xin vui lòng cho biết những gì có thể được thực hiện thêm càng sớm càng tốt. Tôi đã xem xét rất nhiều tài liệu và rất nhiều mã nhưng không thể tìm thấy bất kỳ giải pháp nào. Xin hãy giúp ..

Trả lời

0

Dưới đây là một số mã xử lý lỗi tốt hơn. Lỗi gì xảy ra? Bạn có thể tra cứu mô tả lỗi bằng cách tìm kiếm nó trong tài liệu.

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"); 
} 
Các vấn đề liên quan