2017-05-30 4 views
0

2つのデータ(例:dataAとdataB)を再生する必要のあるオーディオアプリケーションを開発しています。アプリケーションの目的のために、オーディオデータを次の順序で再生する必要があります:AVAudioPlayerは1つのデータを再生してから別のデータを繰り返し再生します。

|データA |データB |データB | ...データBのN回繰り返す... |

簡単な解決策は、上記のデータ構造(1つのdataA + N dataB)を含む超大規模のNSDataを作成することです。ただし、特にN> 10000の場合は非効率的です。

オーディオ再生バッファを直接制御できるシステムでは、dataAを再生バッファにプッシュし、forループを使用してdataBを何度も(データBの繰り返しを保存するために超大容量のバッファを割り当てずに)私が望むように。

AVAudioPlayerではどうすれば実現できますか? (注:アプリケーションの目的のために、dataAの直後に0の遅延で再生されているdataBを必要とするので、複数のAVAudioPlayerクラスを使用することはできません)

答えて

1

2つのAVPlayerインスタンスを作成します。 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; 
       } 
     } 
    } 
関連する問題