【问题标题】:AVAudioEngine uses wrong format when bluetooth headset plugged in插入蓝牙耳机时 AVAudioEngine 使用错误格式
【发布时间】:2017-11-22 21:34:52
【问题描述】:

我有一副带麦克风输入的蓝牙耳机。没有使用麦克风,但是使用时,输入和输出都被强制为 8000kHz。

我的 AVAudioEngine 实例以 8000kHz 模式连接到耳机,除非我进入系统设置并指定我不想使用耳机进行输入(每次连接耳机时都必须这样做)。

我注意到其他应用程序可以毫无问题地以预期的 44100kHz 播放。我的 AVAudioEngine 图中没有输入节点。

如何让 AVAudioEngine 更喜欢以合理的采样率连接?

【问题讨论】:

标签: ios macos audio bluetooth avaudioengine


【解决方案1】:

在我的赏金失败后,我写信给 Apple DTS,得到了很好的回复(包括下面我从 Objective-C 翻译的代码示例)。

以下函数将以仅输出模式连接到默认音频设备,而不是默认行为的输入/输出模式。记得在引擎启动前调用它!

func setOutputDeviceFor(_ engine: AVAudioEngine) -> Bool {
    var addr = AudioObjectPropertyAddress(
        mSelector: kAudioHardwarePropertyDefaultOutputDevice,
        mScope: kAudioObjectPropertyScopeGlobal,
        mElement: kAudioObjectPropertyElementMaster)

    var deviceID: AudioObjectID = 0
    var size = UInt32(MemoryLayout.size(ofValue: deviceID))
    let err = AudioObjectGetPropertyData(
        AudioObjectID(kAudioObjectSystemObject),
        &addr,
        0,
        nil,
        &size,
        &deviceID)

    if (noErr == err && kAudioDeviceUnknown != deviceID) {
        do {
            try engine.outputNode.auAudioUnit.setDeviceID(deviceID)
        } catch {
            print(error)
            return false
        }
        return true
    } else {
        print("ERROR: couldn't get default output device, ID = \(deviceID), err = \(err)")
        return false
    }
}

【讨论】:

  • 嘿 Henrik,Apple 工程师有没有告诉过你为什么或者在什么地方这个代码在只输出模式下连接?这是否意味着当不明确连接到输出设备时,引擎将同时连接到默认输入和默认输出?
  • 我没有得到任何关于为什么默认是这样的细节。但是,是的,默认情况下它连接到两者。上面的代码只连接到输出元素的原因是因为它没有指定输入,只有“kAudioHardwarePropertyDefaultOutputDevice”。
猜你喜欢
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
相关资源
最近更新 更多