【问题标题】:AVFoundation AVAudioSourceNode format seems to be a native Format, different from the rest of AVAudioEngineAVFoundation AVAudioSourceNode 格式似乎是一种原生格式,与 AVAudioEngine 的其余部分不同
【发布时间】:2020-03-24 22:57:21
【问题描述】:

我正在使用 swift 的 AVFoundation 框架来播放一些音频。我创建了一个 AVAudioSourceNode,它将传递一些要播放的样本。

let srcNode = AVAudioSourceNode { _, timeStamp, frameCount, AudioBufferList -> OSStatus in
        let ablPointer = UnsafeMutableAudioBufferListPointer(AudioBufferList)

}

然后我将它附加到音频引擎。并将其连接到混音器。

engine.attach(srcNode)
engine.connect(srcNode, to: engine.mainMixerNode, format:  srcNode.inputFormat(forBus:0))

如果我启动引擎,就会播放音频。然而,当我深入研究,并通过打印格式来探测这个 SourceNode 的格式时,sampleRate 是 44,100。我的音频硬件的采样率为 48,000。

我想不通的是,如果我有一个预先生成的样本数组,以 48kHz 播放。 sourceNode 将以 44.1kHz 的速度读取它,然后引擎会将其转换为 48kHz 以在我的硬件上播放,这意味着实际播放的音频比预期的原始音频要长。

我如何才能真正指定此 AVAudioSourceNode 的格式,以便它以相同的速率工作? (同样,虽然我可以更改 engine.connect 调用中的格式,但这只会更改连接格式,而不是 sourceNode 运行的速率。

【问题讨论】:

    标签: swift audio avfoundation core-audio


    【解决方案1】:

    这个问题有两个答案:(a) 怎么做,(b) 为什么它不起作用。

    (a) 如何设置AVSourceNode 的输出采样率

    您在 AVAudioSession 上设置首选采样率,而不是在节点上。

    let audioSession = AVAudioSession.sharedInstance()
    let playbackRate = 48_000
    do {
        try audioSession.setPreferredSampleRate(playbackRate)
    } catch {
        print("Setting PreferredSampleRate to \(playbackRate) failed.")
    }
    

    (b) 为什么它不起作用

    实际上,如果针对 macOS 或 iOS 模拟器,这确实有效。如果针对 iOS 设备(从 13.4.1 开始),无论如何,您将始终拥有 44.1kHz。我不确定这是错误还是硬件限制。

    【讨论】:

    • AVAudioSession 在 Mac OS 中不可用
    • 啊,是的。我的目标是 Mac Catalyst 13.0
    • 这不是真的。 iOS 设备上的采样率是动态的并且不断变化。例如,如果您插入一组 airpods,采样率将下降到较低的速率。另外,我可能弄错了,但我相信 48k 是现代 iOS 设备的默认值,而不是 44.1k。这就是为什么它被称为“首选”采样率。
    • @dmann200 你说的是 AVAudioSession 的播放率,是的,你希望输出采样率。然而,让我大吃一惊的是,当我使用我在所有 iOS 设备上找到的 AVSourceNode 时,无论会话速率如何,采样率始终为 44.1kHz。
    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2021-12-11
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多