AVAudioSinkNode 具有非默认但仍然是设备本机采样率

aku*_*kuz 5 core-audio swift avaudioengine

我已经配置了AVAudioSinkNodeAttach to ,AVAudioEngine如下inputNode所示:

let sinkNode = AVAudioSinkNode() { (timestamp, frames, audioBufferList) -> OSStatus in
    print("SINK: \(timestamp.pointee.mHostTime) - \(frames) - \(audioBufferList.pointee.mNumberBuffers)")
    return noErr
}

audioEngine.attach(sinkNode)
audioEngine.connect(audioEngine.inputNode, to: sinkNode, format: nil)
audioEngine.prepare()

do {
    try audioEngine.start()
    print("AudioEngine started.")
} catch {
    print("AudioEngine did not start!")
}
Run Code Online (Sandbox Code Playgroud)

我已经单独将其配置为使用“内置麦克风”设备(我确信它确实使用了)。

如果我将麦克风的采样率设置为 44100(使用 Apple 在所有 Mac 上提供的“音频 MIDI 设置”应用程序),一切都会按预期工作:

AudioEngine started.
SINK: 692312319180567 - 512 - 2
SINK: 692312348024104 - 512 - 2
SINK: 692312359634082 - 512 - 2
SINK: 692312371244059 - 512 - 2
SINK: 692312382854036 - 512 - 2
...
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用“音频 MIDI 设置”应用程序(由 Apple 在所有 Mac 上提供),并将麦克风的采样率更改为44100 以外的任何值(比如 48000),那么接收器节点似乎不会执行任何操作(不会执行任何操作)不打印任何东西)。

当然,最初我试图以编程方式修改麦克风的采样率。但后来我发现,当我通过标准的“音频 MIDI 设置”应用程序更改设备采样率时,也会发生同样的情况。因此,我用于设置采样率的代码没有必要在这里发布。

有谁知道是否AVAudioSinkNode允许将采样率硬编码到其中

我找不到任何其他解释...

小智 3

我一直在摆弄 AVAudioSinkNodes,在我看来它并不局限于 44100 采样率。

就我而言,当我在连接输入和接收器节点后检查它们的采样率时,我得到以下信息:

Input node sample rates: 
    IF <AVAudioFormat 0x600002527700:  2 ch,  48000 Hz, Float32, non-inter> 
    OF <AVAudioFormat 0x60000250fac0:  2 ch,  48000 Hz, Float32, non-inter>

Sink node sample rates: 
    IF <AVAudioFormat 0x60000250fbb0:  2 ch,  44100 Hz, Float32, non-inter> 
    OF <AVAudioFormat 0x60000250fb60:  2 ch,  44100 Hz, Float32, non-inter>
Run Code Online (Sandbox Code Playgroud)

但是一旦我将它们连接在一起,我得到了以下结果:

Input node sample rates: 
    IF <AVAudioFormat 0x600002527980:  1 ch,  48000 Hz, Float32> 
    OF <AVAudioFormat 0x600002506760:  2 ch,  48000 Hz, Float32, non-inter>

Sink node sample rates: 
    IF <AVAudioFormat 0x600002506710:  2 ch,  48000 Hz, Float32, non-inter> 
    OF <AVAudioFormat 0x600002505db0:  2 ch,  48000 Hz, Float32, non-inter>
Run Code Online (Sandbox Code Playgroud)

我是使用音频框架的新手,但这似乎表明接收器节点的采样率不是硬编码的。

您的连接,

audioEngine.connect(audioEngine.inputNode, to: sinkNode, format: nil)
Run Code Online (Sandbox Code Playgroud)

好像和我的不一样。audioEngine.inputNode.outputFormat(forBus: 0)不管正确与否,我明确指定了导致显示设置的格式。不确定这是否有影响。