AVAudioSessionCategoryAmbient

AVAudioSessionCategoryAmbient

我正在制作一个记录(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/

10-12 14:46