gpt4 book ai didi

ios - 如何让 AVCaptureSession 和 AVPlayer 尊重 AVAudioSessionCategoryAmbient?

转载 作者:搜寻专家 更新时间:2023-10-31 22:07:09 26 4
gpt4 key购买 nike

我正在制作一个录制 (AVCaptureSession) 和播放 (AVPlayerLayer) 视频的应用。我希望能够在不暂停来自其他应用程序的背景音频的情况下执行此操作,并且我希望播放尊重静音开关。

在 AppDelegate 中,我设置了 AVAudioSessionCategoryAmbient,根据文档,这应该:

The category for an app in which sound playback is nonprimary—that is, your app can be used successfully with the sound turned off.

This category is also appropriate for “play along” style apps, such as a virtual piano that a user plays while the Music app is playing. When you use this category, audio from other apps mixes with your audio. Your audio is silenced by screen locking and by the Silent switch (called the Ring/Silent switch on iPhone).

这完美地描述了我正在寻找的行为。但它不起作用。

我知道它已设置,因为如果我在任何 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 block 中的第一行让我纠结了很长时间。我不需要将 Audio Session 设置为非事件状态即可切换到 AVAudioSessionCategoryAmbient,但在返回到 AVAudioSessionCategoryPlayAndRecord 时它会暂停背景音频。

关于ios - 如何让 AVCaptureSession 和 AVPlayer 尊重 AVAudioSessionCategoryAmbient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33793893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com