说到播放音频比较常用的AVAudioPlayer
,自身带有可以循环播放的属性numberOfLoops
该值为负数就能实现无限循环播放,但是这只满足一些音频有间歇的可以满足,如果音频文件没有间歇(一直有声音的情况)如果需要无限循环播放就会出现播放中间有卡顿的情况,那就不能使用numberOfLoops = -1
来解决了。
由于AVAudioPlayer没有监听播放进度的API 所以选择了AVPlayer播放音频文件(addPeriodicTimeObserverForInterval:,实时监听播放进度)
解决方案:使用2个播放器播放同一个音频
具体实施:前一个播放器将要播放完成的时候,创建第二个播放器播放,第一个播放器播放完成之后释放掉,继续监听第二个播放器,第二个播放器将要完成的时候创建第三个播放器,然后释放掉...... 依次创建
NSURL *url = [[NSBundle mainBundle] URLForResource:musicName withExtension:@"mp3"];
AVPlayerItem * playerItem = [[AVPlayerItem alloc]initWithURL:url];
AVPlayer *tPlayer = [[AVPlayer alloc]initWithPlayerItem:playerItem];
id observer = [tPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 10.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
float currentTime = CMTimeGetSeconds(time); // 当前播放时长
float totalTime = CMTimeGetSeconds(playerItem.duration); // 总时长
// 这里判断 什么时候创建第二个播放器,
}]
一定记住第一个播放完成之后一定要释放掉添加的监听条件
[tPlayer removeTimeObserver: observer];
以上是整体的核心步骤