【问题标题】:Pass through CMSampleBufferRef data to audio output jack将 CMSampleBufferRef 数据传递到音频输出插孔
【发布时间】:2013-03-08 14:22:31
【问题描述】:

我正在开发一个应用程序,其中我需要通过输出音频插孔通过音频捕获同时录制和保存视频。

我研究了 aurio touch apple 示例代码并实现了音频直通。

我还通过AVCaptureSession实现了视频录制。 以上两个功能都单独完成并完美运行。

但是,当我合并功能时,由于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); }

但它给出了错误。请尽快告知可以进一步采取的措施。我查看了很多文档和代码,但找不到任何解决方案。请帮忙..

【问题讨论】:

    标签: ios avfoundation core-audio


    【解决方案1】:

    这里有一些更好的错误处理代码。它返回什么错误?您可以通过在文档中搜索来查找错误描述。

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

    【讨论】:

      猜你喜欢
      • 2016-08-03
      • 2013-05-27
      • 2013-11-25
      • 2023-04-08
      • 2012-11-15
      • 1970-01-01
      • 2013-02-20
      • 2017-08-18
      • 1970-01-01
      相关资源
      最近更新 更多