Swift 技术 音频,音乐(AVAudioSession设置,音乐中断,电话抢占)

Swift 技术 音频,音乐(AVAudioSession设置,音乐中断,电话抢占) 一直觉得自己写的不是技术而是情怀一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的希望我的这条路能让你们少走弯路希望我能帮你们抹去知识的蒙尘希望我能帮你们理清知识的脉络希望未来技术之巅上有你们也有我。相关文章Swift 技术 音频,音乐(AVAudioSession设置,音乐中断)Swift 技术 监听电话中断,音乐(用于恢复播放音乐)(源码)Swift 第三方 播放器AliyunPlayer(阿里云播放器)(源码)Swift 需求 音乐播放暂停淡出淡放(声音逐渐消失)(视频)(源码)OC 技术 DOUAudioStreamer音乐播放器的使用(源码)Swift 基础 AVPlayer音乐播放器的使用(源码)前言音频输出作为硬件资源对于iOS系统来说是唯一的需要通过“AVAudioSession”这个系统级全局对象对各个App进行控制正题常见音频场景1.是进行录音还是播放2.当系统静音键按下时该如何表现3.是从扬声器还是从听筒里面播放声音4.插拔耳机后如何表现5.来电话/闹钟响了后如何表现6.其他音频App启动后如何表现通过“AVAudioSession”可以做什么操作1.为app选择输入输出的路由通过扬声器或者听筒播放–可以手动设置通过手机上扬声器/听筒或者耳机播放–系统自动切换插入耳机默认耳机2.为app选择输入的路由通过手机麦克风或者耳机麦克风采集-系统自动切换插入耳机默认耳机3.协调音频播放的app之间的关联以及系统的声音处理4.处理被其他app打断后的情况5.录音或者播放音乐AVAudioSession默认行为1.可以进行播放但是不能进行录制。2.当用户将手机上的静音拨片拨到“静音”状态时此时如果正在播放音频那么播放内容会被静音。3.当用户按了手机的锁屏键或者手机自动锁屏了此时如果正在播放音频那么播放会静音并被暂停。4.如果你的App在开始播放的时候此时QQ音乐或其他App正在播放那么其他播放器会被静音并暂停。5.系统会在app启动的时候激活这个全局唯一的AVAudioSession音频模式七大场景该场景由7个类别分别控制默认是CategorySoloAmbientAVAudioSessionCategoryAmbient独占播放 :只用于播放音乐时并且可以和QQ音乐同时播放比如玩游戏的时候还想听QQ音乐的歌那么把游戏播放背景音就设置成这种类别。同时当用户锁屏或者静音时也会随着静音这种类别基本适用所有App的背景场景。AVAudioSessionCategorySoloAmbient:也是只用于播放,但是和AVAudioSessionCategoryAmbient不同的是用了它就别想听QQ音乐了比如不希望QQ音乐干扰的App类似节奏大师。同样当用户锁屏或者静音时也会随着静音锁屏了就玩不了节奏大师了。AVAudioSessionCategoryPlayback:如果锁屏了还想听声音怎么办用这个类别比如App本身就是播放器同时当App播放时其他类似QQ音乐就不能播放了。所以这种类别一般用于播放器类AppAVAudioSessionCategoryRecord:有了播放器肯定要录音机比如微信语音的录制就要用到这个类别既然要安静的录音肯定不希望有QQ音乐了所以其他播放声音会中断。想想微信语音的场景就知道什么时候用他了。AVAudioSessionCategoryPlayAndRecord:如果既想播放又想录制该用什么模式呢比如VoIP打电话这种场景PlayAndRecord就是专门为这样的场景设计的 。AVAudioSessionCategoryMultiRoute:想象一个DJ用的App手机连着HDMI到扬声器播放当前的音乐然后耳机里面播放下一曲这种常人不理解的场景这个类别可以支持多个设备输入输出。AVAudioSessionCategoryAudioProcessing:主要用于音频格式处理一般可以配合AudioUnit进行使用上面介绍的七大类别可以认为是设定了七种主场景而这七类肯定是不能满足开发者所有的需求的。AVAudioSession提供的方法是首先定下7种类别中的一种基调再进行微调。AVAudioSession为每种Category都提供了些许选项来进行微调。设置方法//设置音乐的播放模式 private func setAudioSupport(){ let session AVAudioSession.sharedInstance() do { try session.setCategory(AVAudioSession.Category.playback) try session.setActive(true) } catch { print(error) } UIApplication.shared.beginReceivingRemoteControlEvents() }类别的选项AVAudioSessionCategoryOptionMixWithOthers 如果确实用的AVAudioSessionCategoryPlayback实现的一个背景音但是又想和QQ音乐并存可以在AVAudioSessionCategoryPlayback类别下在设置这个选项就可以实现共了。AVAudioSessionCategoryOptionDuckOthers 在实时通话的场景比如QQ音乐当进行视频通话的时候会发现QQ音乐自动声音降低了此时就是通过设置这个选项来对其他音乐App进行了压制。AVAudioSessionCategoryOptionAllowBluetooth 如果要支持蓝牙耳机电话则需要设置这个选项AVAudioSessionCategoryOptionDefaultToSpeaker 如果在VoIP模式下希望默认打开免提功能需要设置这个选项七大模式AVAudioSessionModeDefault每种类别默认的就是这个模式。AVAudioSessionModeVoiceChat主要用于VoIP场景此时系统会选择最佳的输入设备比如插上耳机就使用耳机上的麦克风进行采集。同时会设置类别的选项为AVAudioSessionCategoryOptionAllowBluetooth从而支持蓝牙耳机。AVAudioSessionModeVideoChat主要用于视频通话比如QQ视频、FaceTime。系统会选择最佳的输入设备比如插上耳机就使用耳机上的麦克风进行采集并且会设置类别的选项为AVAudioSessionCategoryOptionAllowBluetooth 和 “AVAudioSessionCategoryOptionDefaultToSpeaker”。AVAudioSessionModeGameChat适用于游戏App的采集和播放比如“GKVoiceChat”对象一般不需要手动设置每个模式有其适用的类别可以根据具体需要做对应的组合。音频通知系统中断通知(用于恢复播放音乐)(源码)Swift-(通知-interruptionNotification)电话挂断恢复音乐播放-代码实例Swift 技术 监听电话中断,音乐(用于恢复播放音乐)(源码)改文章有更好的解决办法电话,闹钟响亲身试过可行如果app正在视频通话突然来电话了、闹钟响了等最常用的场景是先暂停待恢复的时候再继续。app可以通过监听系统消息AVAudioSessionInterruptionNotification来处理。系统消息userInfo主要包含两个键AVAudioSessionInterruptionTypeKey取值为AVAudioSessionInterruptionTypeBegan表示中断开始我们应该暂停播放和采集取值为AVAudioSessionInterruptionTypeEnded表示中断结束我们可以继续播放和采集。AVAudioSessionInterruptionOptionKey 当前只有一种值AVAudioSessionInterruptionOptionShouldResume表示此时也应该恢复继续播放和采集。其他app占用通知Swift 技术 监听电话中断,音乐(用于恢复播放音乐)(源码)改文章有更好的解决办法A-AppSwift-(通知-silenceSecondaryAudioHint)中断音乐-代码实例B-AppSwift-(通知-interruptionNotification)电话挂断恢复音乐播放-代码实例其他App占据AudioSession的时候用需要接收通知的话,需要接收通知的app设置为 playblack, 然后占据的app 设置为: ambient,当收通知的app正在播放音乐时,占据的app启动播放音乐时,收通知的app就会接受到通知AVAudioSessionSilenceSecondaryAudioHintNotification来进行通知。其回调回来的userInfo键为AVAudioSessionSilenceSecondaryAudioHintTypeKeyAVAudioSessionSilenceSecondaryAudioHintTypeBegin表示其他App开始占据SessionAVAudioSessionSilenceSecondaryAudioHintTypeEnd表示其他App开始释放Session外设改变通知默认情况下AVAudioSession会在App启动时选择一个最优的输出方案比如插入耳机的时候就用耳机。但是这个过程中用户可能拔出耳机app可以通过监听系统消息AVAudioSessionRouteChangeNotification来处理。针对视频通话场景设置类别AVAudioSessionCategoryPlayAndRecord类别的选项AVAudioSessionCategoryOptionAllowBluetoothAVAudioSessionCategoryOptionDefaultToSpeaker模式AVAudioSessionModeVideoChat如果想做录制一段音频然后进行播放的操作。建议录音修改为也就是支持录音的模式建议播放修改为也就是只播放的模式。经过我的测试播放时使用AVAudioSessionCategoryPlayAndRecord录音播放模式会导致播放声音很小。AVAudioSessionCategorySoloAmbient 或 AVAudioSessionCategoryAmbient 或AVAudioSessionCategoryPlaybackBugNML(音乐App启动瞬间停止播放,汽水音乐的App)?1.如何做到启动顺便停止汽水音乐的App的音乐播放?2.如果我想在点击播放按键的时候才停止播放,音乐的App的音乐播放.如何修改?造成该原因是因为下面的代码造成的.一旦启动就会停止,汽水音乐正在播放的音乐.因为App启动的时候,category默认的设置是:AVAudioSessionCategorySoloAmbient只要把上面的代码不要写在Appdelegate里面启动,就不会停止汽水音乐播放的音乐.那么上面的第二个问题,如果我想在点击播放按键的时候才停止播放,音乐的App的音乐播放.如何修改?把这句代码写在点击播放的哪里,也就是播放才设置.