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
我正在使用 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