代码之家  ›  专栏  ›  技术社区  ›  Chris

AVPlayer不通过蓝牙耳机输出音频

  •  0
  • Chris  · 技术社区  · 4 年前

    我有一个 avassetwriter 捕获会话以录制视频和2 avplayerqueues 播放立即录制的视频和其他视频,播放过去保存的视频。

    我的问题是音频输入不使用蓝牙耳机,而是通过iphone设备的输入/输出执行播放和录制。

    我没有对扬声器默认设置进行任何覆盖,我知道在蓝牙和设备之间切换的情况下,我需要通过notification observer处理路由更改,并尝试设置 AVAudioSession.sharedInstance() .playbackAndRecording 分类到 .allowBluetooth 没用。

    如果您能提供任何指导,我将不胜感激,因为我还没有在网上找到现有的答案。。

    let audioSession = AVAudioSession.sharedInstance()
        
        //Executed right before playing avqueueplayer media
        do {
            try audioSession.setCategory(.playback)
            try audioSession.setActive(true)
        } catch {
            fatalError("Error Setting Up Audio Session")
        }
    
    
        //Executed right after avqueueplayer finishes media
        do {
            try audioSession.setCategory(.recording, options: [.allowBluetooth])
            try audioSession.setActive(true)
        } catch {
            fatalError("Error Setting Up Audio Session")
        }
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   Rob Napier    4 年前

    你仔细阅读了你的文档了吗 .allowBluetooth .allowBluetoothA2DP ? 这些并不意味着你可能认为它们意味着什么,因为通过这两个测试很少是开发人员的意思。不要根据事物的名称猜测AVFoundation会做什么;你必须阅读文件。事物的名称并不明显,而且在一些地方具有误导性。

    如果你想通过蓝牙耳机录音,你不能支持A2DP。A2DP是一种单向协议(仅限播放)。你需要使用HFP,这是什么 .allowBluetooth 方法去除 .allowBluetoothA2DP .请注意,这会显著降低您的音频质量。

    如果您有不同的录制和播放时间段,那么您希望在更改模式时更改类别。不要只是设定 .playAndRecord 因为你会在某个时刻录制,在另一个时刻回放。如果切换到仅播放的情况,请切换到 .playback .在会话处于活动状态时更改类别是合法的(同样,请参阅文档;有许多微妙的规则)。

    你还没有列出你的蓝牙耳机是什么,所以不清楚它们是否同时支持A2DP和HFP。这对路由的发生方式有重大影响。有关详细信息,请参阅文档 .allowBluetoothA2DP 关于这个。