AVCaptureSession 和 AudioQueue

Posted

技术标签:

【中文标题】AVCaptureSession 和 AudioQueue【英文标题】:AVCaptureSession and AudioQueue 【发布时间】:2012-02-29 08:53:26 【问题描述】:

我是 Objective-C 和 ios 的新手,我需要你的帮助。我想获取我的麦克风音频输入并将其直接重定向到扬声器输出中(不通过文件)。

我在这里:使用 AVCaptureSession 获取我的麦克风输入并使用 AudioQueue 尝试播放输出缓冲区。但是我在互联网上找不到任何东西,似乎没有人需要这样做。我是不是误会了什么? 我只想知道如何将我的 CMsampleBufferRef 转换为我的 AudioQueue 可以用来播放的良好 pcmbuffer(以及在我的 AudioQueue 中修改什么以将其与我的 AVCaptureSession 链接)。这是好方法吗? 我发现了很多东西可以将输出缓冲区写入文件,但是为了即时执行某些操作,什么也没有,或者只是简短的解释,我还不能使用。

请你给我一个非常详细的示例代码解释,因为我是一个新手。现在我可以使用我的 AVCaptureSession(CMSampleBufferRef 中有一些东西),我可以用我的 AudioQueue 播放一个文件,但是当我想链接这两个时,我不知道该怎么做。

提前致谢

【问题讨论】:

【参考方案1】:

请参阅下面我编写的代码(使用我在网上找到的参考资料)。我还没有彻底测试过。

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection

    AudioBufferList bufList;
    CMBlockBufferRef blockBuffer;
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, NULL, &bufList, sizeof(bufList), NULL, NULL, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer);


    NSMutableData *currentSample = nil;
    for(int i = 0; i < bufList.mNumberBuffers; i++)
    
        if(i == 0)
        
            currentSample = [NSMutableData dataWithBytes:bufList.mBuffers[i].mData length:bufList.mBuffers[i].mDataByteSize];
        else
        
            [currentSample appendBytes:bufList.mBuffers[i].mData length:bufList.mBuffers[i].mDataByteSize];
        
    

【讨论】:

以上是关于AVCaptureSession 和 AudioQueue的主要内容,如果未能解决你的问题,请参考以下文章

如何让 AVCaptureSession 和 AVPlayer 尊重 AVAudioSessionCategoryAmbient?

为啥使用 AVCaptureSession、AVAssetWriter 和 AVPlayer 录制和回放视频会卡顿?

如何在 AVCaptureSession 上设置音频采样率?

如何正确清理 AVCaptureSession 和 AVCaptureVideoPreviewLayer

使用 AVCaptureSession 录制视频

从同一个 AVCaptureSession 拍摄视频和照片时应用程序崩溃?