如何将背景音频与AVCapture会话混合:
如果你有麦克风输入,AVCapture会话会默认将你的应用程序的AVAudioSession设置为AVAudioSessionCategoryPlayAndRecord
。你需要告诉它不要这样做:
AVCaptureSession.automaticallyConfiguresApplicationAudioSession = false
然而,这样做只会使应用程序冻结。因为不幸的是,AVAudioSessionCategoryAmbient
与 AVCaptureSession
不兼容。
解决方案是将你的应用程序的 AVAudioSession
设置为带有选项的 AVAudioSessionCategoryPlayAndRecord
:
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.MixWithOthers, .AllowBluetooth, .DefaultToSpeaker])
try AVAudioSession.sharedInstance().setActive(true)
} catch let error as NSError {
print(error)
}
.MixWithOthers
是最重要的选项之一。它允许其他应用程序的音频播放。但它会切换到从听筒输出,这非常奇怪(起初我以为它会被压低)。所以.DefaultToSpeaker
将其移动到底部扬声器,.AllowBluetooth
允许您保持蓝牙音频通过耳机输出,同时启用蓝牙麦克风。不确定是否可以进一步改进,但它们似乎是所有相关选项。
如何在播放中尊重静音开关:
在录制过程中,您将AVAudioSession
设置为AVAudioSessionCategoryPlayAndRecord
,但这不尊重静音开关。
因为当存在麦克风输入时,您无法设置AVAudioSessionCategoryAmbient
。诀窍是从AVCaptureSession
中删除麦克风,然后将AVAudioSession
设置为AVAudioSessionCategoryAmbient
:
do {
captureSession.removeInput(micInput)
try AVAudioSession.sharedInstance().setActive(false)
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
try AVAudioSession.sharedInstance().setActive(true)
} catch let error as NSError { print(error) }
一旦您完成了播放并需要返回录制状态,您需要再次设置 AVAudioSessionCategoryPlayAndRecord
(并再次使用选项以便后台音频继续播放):
完成回放后需要返回录制状态时,必须重新设置AVAudioSessionCategoryPlayAndRecord
(同时再次使用选项以使后台音频继续播放):
返回内容为:
<p>完成回放后需要返回录制状态时,必须重新设置<code>AVAudioSessionCategoryPlayAndRecord</code>(同时再次使用选项以使后台音频继续播放):</p>
do {
try AVAudioSession.sharedInstance().setActive(false)
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord, withOptions: [.MixWithOthers, .AllowBluetooth, .DefaultToSpeaker])
try AVAudioSession.sharedInstance().setActive(true)
} catch let error as NSError { print(error) }
captureSession.automaticallyConfiguresApplicationAudioSession = false
captureSession.addInput(micInput!)
在do
块中的第一行内容困扰了我很长时间。我不需要将音频会话设置为非活动状态即可切换到AVAudioSessionCategoryAmbient
,但当切换回AVAudioSessionCategoryPlayAndRecord
时它会暂停后台音频。
AVAudioSessionCategoryPlayAndRecord
模式。 - Warpling