搜尋

首頁  >  問答  >  主體

objective-c - iOS AVAudioPlayer播放 AVAudioRecorder录音问题

如何保证只有1个Player在播放或者?

目前是,对于1个app内,很多个AVAudioPlayer Play.或者,AVAudioRecorder record .其他可以被打断?不需要我自己弄个全局变量保存正在播放的player.和正在录音的 recorder.
众所周知,我们的app播放可以打断别人的app的声音。

个人感觉打断也分为,直接中断和减弱别人的声音?不知道有没有

题外话,AVAudioPlayer的网络链接直接播放缓存问题

AVAudioPlayer 可以直接通过网址播放,但是这样看不到下载的进度,和最后要不要保留已经下好的。如果重新播放,都将进行重新下载。如网易云音乐就做的很好。

黄舟黄舟2772 天前1033

全部回覆(1)我來回復

  • 阿神

    阿神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用本地播放,如果沒有卡頓則一直播放串流媒體。可能有更好的方法,拋磚引玉了。

    希望能夠幫助你

    回覆
    0
  • 取消回覆