我正在开发一个需要播放两个数据的音频应用程序(例如:dataA和dataB)。出于应用程序的目的,它应按此顺序播放音频数据:
| dataA | dataB | dataB | ......重复N次数据B ... |
一个简单的解决方案是创建一个包含上述数据结构的超大型NSData(1 dataA + N dataB)。然而,它是低效的,尤其是当N> 1时。 10000
在我可以直接控制音频播放缓冲区的Android或其他系统中,我可以简单地将dataA推送到播放缓冲区,然后使用for循环将dataB放入我想要的次数(不分配超大缓冲区)保存重复数据B)。
如何通过AVAudioPlayer实现? (注意:出于应用程序的目的,我需要在dataA之后直接播放dataB,延迟为0。所以不可能使用多个AVAudioPlayer类)
答案 0 :(得分: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;
}
}
}