我正在制作一个记录(AVCaptureSession
)和播放(AVPlayerLayer
)视频的应用程序。我希望能够在不暂停其他应用程序的背景音频的情况下执行此操作,并且希望播放过程中遵守静音开关。
在AppDelegate中,我根据文档设置了AVAudioSessionCategoryAmbient
,它应该:
这完美地描述了我正在寻找的行为。但这是行不通的。
我知道它已设置,因为如果我在任何 View Controller 中尝试print(AVAudioSession.sharedInstance().category)
,它将返回AVAudioSessionCategoryAmbient
。
有任何想法吗?我使用的是Swift,但即使是模糊的指导方向,也将不胜感激。
最佳答案
如何将背景音频与AVCapture session 混合:
如果您有麦克风输入,则默认情况下,AVCapture session 会将您的应用程序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
(再次设置选项,以便继续播放背景音频):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
块的第一行是让我困扰很长时间的事情。我不需要将 Audio Session 设置为非事件状态即可切换到AVAudioSessionCategoryAmbient
,但是回到AVAudioSessionCategoryPlayAndRecord
时它暂停了背景音频。关于ios - 如何使AVCaptureSession和AVPlayer尊重AVAudioSessionCategoryAmbient?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33793893/