【问题标题】:AVAudioSinkNode with non-default, but still device-native sample rates具有非默认但仍为设备原生采样率的 AVAudioSinkNode
【发布时间】:2020-03-24 18:41:08
【问题描述】:

我已将AVAudioSinkNode 配置为附加到AVAudioEngineinputNode,如下所示:

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

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

如果我为麦克风设置采样率 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
...

但是,如果我使用“音频 MIDI 设置”应用程序(Apple 在所有 Mac 上提供),并将麦克风的采样率更改为 44100 以外的任何值(比如 48000),则接收节点似乎什么也没做(不打印任何内容)。

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

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

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

【问题讨论】:

    标签: swift core-audio avaudioengine


    【解决方案1】:

    我一直在玩弄 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>
    

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

    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>
    

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

    您的连接,

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

    似乎与我的不同。无论对错,我明确地将格式指定为audioEngine.inputNode.outputFormat(forBus: 0),这导致了显示的设置。不确定这是否会有所不同。

    【讨论】:

    • 感谢这让我走上了正轨,但我需要使用audioEngine.inputNode.inputFormat(forBus: 0)(而不是outputFormat),因为我的麦克风采样率与我的输出设备采样率不同。
    猜你喜欢
    • 2022-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多