>使用应用程序时播放背景音乐(例如,识别)
>从AVPlayer观看电影时播放背景音乐
>录制视频时停止音乐
像Snapchat一样,相机视图控制器是“swipeview”的一部分,因此始终处于打开状态.
然而,当打开和关闭应用程序时,音乐会产生短暂的“破裂”噪音/声音,从而破坏音乐.
我记录在这里:
https://soundcloud.com/morten-stulen/hacky-sound-ios
(3次)
我使用这些设置来更改appAlegate didFinishLaunchingWithOptions中的AVAudiosession:
do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayAndRecord,withOptions: [AVAudioSessionCategoryOptions.MixWithOthers,AVAudioSessionCategoryOptions.DefaultToSpeaker]) try AVAudioSession.sharedInstance().setActive(true) } catch { print("error") }
我使用LLSimpleCamera控件进行视频录制,我已经将会话设置为:
_session.automaticallyConfiguresApplicationAudioSession = NO;
似乎其他人也有与其他相机库相同的问题:
https://github.com/rFlex/SCRecorder/issues/127
https://github.com/rFlex/SCRecorder/issues/224
这个家伙删除了audioDeviceInput,但我需要录制视频.
https://github.com/omergul123/LLSimpleCamera/issues/48
我也试过苹果的代码“AvCam”,我还是有同样的问题. Snapchat如何做到这一点?
任何帮助将不胜感激,我乐意提供更多的信息或代码!
解决方法
我做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 @R_404_159@") } } 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 @R_404_159@") } }
当我想要停止背景音频时,例如当播放应该是单独的音轨时,我执行以下操作:
在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() }
希望这可以帮助你!