AVCaptureSession 音频样本以不同于 AVAudioSession 采样率的频率捕获

AVCaptureSession audio samples captured at different frequency than AVAudioSession's sample rate

我正在使用 AVFoundation 捕获会话通过 AVCaptureAudioDataOutput 输出音频缓冲区。捕获会话使用默认的应用程序音频会话。 (即 captureSession.usesApplicationAudioSession = 真)。我不会以任何方式改变音频会话。

奇怪的行为是捕获会话 returns 音频缓冲区以不同于默认音频会话采样率的频率捕获。

具体来说:

print(AVAudioSession.sharedInstance().sampleRate) \ 48000

但是

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        if connection.audioChannels.first != nil {
            print(sampleBuffer.presentationTimeStamp) \ CMTime(value: 2199812320, timescale: 44100, flags: __C.CMTimeFlags(rawValue: 3), epoch: 0)
            delegate?.captureOutput(sampleBuffer: sampleBuffer, mediaType: .audio)
        } 
    }

我的预期行为是样本缓冲区的时间刻度也将是 48000。

关于一些额外的信息,如果我确实更改了默认音频会话,例如,将首选采样率更改为 48000,样本缓冲区的时间刻度将按预期更改为 48000。这是一个错误还是我误解了什么?

您需要将捕获会话的 automaticallyConfiguresApplicationAudioSession 设置为 false,并在开始捕获会话之前进行您自己的音频会话配置。

像这样:

// use audioSession.setPreferredSampleRate() to request desired sample rate
captureSession.automaticallyConfiguresApplicationAudioSession = false
try! AVAudioSession.sharedInstance().setCategory(.playAndRecord) // or just record
try! AVAudioSession.sharedInstance().setActive(true) // worked without this, but feels wrong