2017-05-30 79 views
0

我正在開發一個需要播放兩個數據(如:dataA和dataB)的音頻應用程序。爲了應用程序的目的,它應該按照以下順序播放音頻數據:AVAudioPlayer播放一個數據(一次),然後重複播放另一個數據(多次)

| dataA | dataB | dataB | ......重複N次數據B ... |

它的一個簡單的解決方案是創建一個包含上述數據結構(1 dataA + N dataB)的超大NSData。但是效率很低,特別是當N> 10000時。

在Android或其他可以直接控制音頻播放緩衝區的系統中,我可以簡單地將dataA推送到播放緩衝區,然後有一個for循環將dataB作爲根據需要多次(不分配超大緩衝區來保存dataB的重複)。

AVAudioPlayer如何實現? (注意:爲了應用程序的目的,我需要在dataA之後直接播放dataB,延遲時間爲0,所以不可能使用多個AVAudioPlayer類)

回答

1

創建兩個AVPlayer實例,一個用於播放aData和一個用於播放BDATA。

let aDataPlayer = AVPlayer(url: URL(string: aData_URL)!) 
let bDataPlayer : AVPlayer? = nil 
var counterForbPlayer : Int = 100 //whatever your n value is 

使用AVPlayerItemDidPlayToEndTime在玩家完成遊戲時得到通知。

NotificationCenter.default.addObserver(self, selector: #selector(loadNextudio), name: .AVPlayerItemDidPlayToEndTime, object: nil) 


func loadNextudio() { 
     if self.bDataPlayer == nil { 
       bDataPlayer = AVPlayer(url: URL(string: bData_URL)!) 
       bDataPlayer.play() 
       counterForbPlayer -= 1; 
     } 
     else { 
       if counterForbPlayer > 0 { 
        bDataPlayer?.currentItem?.seek(to: kCMTimeZero) 
        bDataPlayer?.play() 
        counterForbPlayer -= 1; 
       } 
     } 
    }