目前是,对于1个app内,很多个AVAudioPlayer Play.或者,AVAudioRecorder record .其他可以被打断?不需要我自己弄个全局变量保存正在播放的player.和正在录音的 recorder.
众所周知,我们的app播放可以打断别人的app的声音。
AVAudioPlayer 可以直接通过网址播放,但是这样看不到下载的进度,和最后要不要保留已经下好的。如果重新播放,都将进行重新下载。如网易云音乐就做的很好。
阿神2017-04-17 17:15:21
1.一個app內的多個player是可以同時播放的,之前做的音樂播放沒處理好就會出現兩首歌同時播放的情況o(╯□╰)o
2.放在全域裡面的好處就是不需要那麼多的初始化和setting設置,會節省很多時間
3.是否打斷之類的模式在setCategory方法中的AVAudioSessionCategoryPlayAndRecord等值的設置,不能一一解釋,我記得有人是透過一張表格去解釋每個選項是否打斷(包括本app和與其他app)、是否佔用輸入、是否佔用輸出等,現在找不到了,就給一些我用過的設定吧, record時用的是AVAudioSessionCategoryPlayAndRecord,play的時候比較多,AVAudioSessionCategoryPlayback是指即使硬體靜音也阻止不了發出聲音,還有其他的設定就參照apple doc吧,改動太多,不好解釋。類似下程式碼:
//recorder设置
recordSession = AVAudioSession.sharedInstance()
recordSession.setCategory(AVAudioSessionCategoryPlayAndRecord, error: nil)
//player设置
self.player.volume = 1.0
self.player.delegate = self
let session = AVAudioSession.sharedInstance()
session.setCategory(AVAudioSessionCategoryPlayback, error: nil)
//Player的设置有多种玩法
/* MixWithOthers is only valid with AVAudioSessionCategoryPlayAndRecord, AVAudioSessionCategoryPlayback, and AVAudioSessionCategoryMultiRoute */
static var MixWithOthers: AVAudioSessionCategoryOptions { get }
/* DuckOthers is only valid with AVAudioSessionCategoryPlayAndRecord, AVAudioSessionCategoryPlayback, and AVAudioSessionCategoryMultiRoute */
static var DuckOthers: AVAudioSessionCategoryOptions { get }
/* AllowBluetooth is only valid with AVAudioSessionCategoryRecord and AVAudioSessionCategoryPlayAndRecord */
static var AllowBluetooth: AVAudioSessionCategoryOptions { get }
/* DefaultToSpeaker is only valid with AVAudioSessionCategoryPlayAndRecord */
static var DefaultToSpeaker: AVAudioSessionCategoryOptions { get }
4.關於雲音樂的,體驗下來可能也是有些瑕疵的,簡單的做法是這樣的,先播放流媒體,同時下載,progress實際上就是下載的進度,如果流媒體卡頓,則拿到currentTime用本地播放,如果沒有卡頓則一直播放串流媒體。可能有更好的方法,拋磚引玉了。
希望能夠幫助你