Ответ 1
Я делаю что-то похожее на то, что вы хотите, но без аспект камеры, но я думаю, что это будет делать то, что вы хотите. Мое приложение позволяет фоновое аудио, которое будет смешиваться с не полноэкранным видео/аудио. Когда пользователь воспроизводит аудиофайл или полноэкранный видеофайл, я полностью останавливаю фоновый звук.
Причина, по которой я делаю SoloAmbient, а затем Воспроизведение, - это то, что я разрешаю воспроизведение своего звука в фоновом режиме, когда устройство заблокировано. Переход SoloAmbient остановит воспроизведение всех фоновых музыкальных файлов, а затем переключится на Воспроизведение, чтобы мой звук воспроизводился как в приложении, так и в фоновом режиме.
Вот почему вы видите вызов метода, который устанавливает информацию экрана блокировки в методе Unload. В этом случае он обнуляет ее, чтобы не было информации о блокировке экрана.
В AppDelegate.swift
//MARK: Audio Session Mixing
func allowBackgroundAudio()
{
do {
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: .MixWithOthers)
} catch {
NSLog("AVAudioSession SetCategory - Playback:MixWithOthers failed")
}
}
func preventBackgroundAudio()
{
do {
//Ask for Solo Ambient to prevent any background audio playing, then change to normal Playback so we can play while locked
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategorySoloAmbient)
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
} catch {
NSLog("AVAudioSession SetCategory - SoloAmbient failed")
}
}
Когда я хочу остановить фоновый звук, например, при воспроизведении звуковой дорожки, которая должна быть одна, я делаю следующее:
В MyAudioPlayer.swift
func playUrl(url: NSURL?, backgroundImageUrl: NSURL?, title: String, subtitle: String)
{
ForgeHelper.appDelegate().preventBackgroundAudio()
if _mediaPlayer == nil {
self._mediaPlayer = MediaPlayer()
_mediaPlayer!.delegate = self
}
//... Code removed for brevity
}
И когда я закончил играть в медиа, я делаю это:
private func unloadMediaPlayer()
{
if _mediaPlayer != nil {
_mediaPlayer!.unload()
self._mediaPlayer = nil
}
_controlView.updateForProgress(0, duration: 0, animate: false)
ForgeHelper.appDelegate().allowBackgroundAudio()
setLockScreenInfo()
}
Надеюсь, это поможет вам!