kAudioSessionProperty_OverrideAudioRoute 和 kAudioSessionProperty_OverrideCategoryDefaultToSpeaker 之间的区别

Difference between kAudioSessionProperty_OverrideAudioRoute & kAudioSessionProperty_OverrideCategoryDefaultToSpeaker

我对 iOS 中的音频路由覆盖感到困惑,并且不理解 Apple documentation 中关于 kAudioSessionProperty_OverrideAudioRoutekAudioSessionProperty_OverrideCategoryDefaultToSpeaker 之间区别的文档

那么它们之间有什么区别呢?我们应该什么时候使用一个和另一个?

相似之处

  1. 两者都只适用于播放和录制类别 (kAudioSessionCategory_PlayAndRecord/AVAudioSessionCategoryPlayAndRecord)
  2. 两者都覆盖了奇怪的播放和录音选择,默认音频输出到超级安静、小巧的接收器(事实上,播放和录音类别是为 VOIP 设计的,您可以在其中按住 phone 靠近您的耳朵并像使用...电话一样使用它phone,从而避免您的听力受损)

差异:

kAudioSessionProperty_OverrideAudioRoute

  1. 较旧(iOS 2.1 及以上)
  2. 只写,略显神秘
  3. 在有耳机的情况下工作,在这种情况下设置 kAudioSessionOverrideAudioRoute_Speaker 也会更改内置麦克风的输入,忽略耳机的麦克风
  4. 它会在音频中断和路由更改(例如 phone 呼叫、警报 - adding/removing 音频设备)时恢复为 "default"。目前尚不清楚它是否会在类别更改期间恢复。如果是这样,那将是另一个相似之处。

kAudioSessionProperty_OverrideCategoryDefaultToSpeaker

  1. "newer"(iOS 3.1 及以上版本)
  2. read/write
  3. 仅在没有其他外部音频设备(例如耳机)可用时有效
  4. 在路线更改或中断期间,其值不会重置为默认值 (FALSE)。

在这两者中,kAudioSessionProperty_OverrideAudioRoute 似乎与 API 一样奇特,因为它有奇怪的副作用和令人惊讶的自行关闭的习惯,所以我会使用 kAudioSessionProperty_OverrideCategoryDefaultToSpeaker

当然,C AudioSession API 在 iOS 7 中已被弃用,因此您应该使用 AVAudioSession 等价物 AVAudioSessionPortOverrideSpeakerAVAudioSessionCategoryOptionDefaultToSpeaker

并且 QA1754 以比我更通俗易懂的方式描述了这两种方法之间的区别。