给一个 mp3 音频资源,循环播放其中的一个片段
本文说一下,两种实现的思路
第一种,主要用 seek 方法
把整个音频资源分配给播放器,跳转到片段开始的地方,就是 seek 过去,
正常播放到片段结尾,再 seek 到片段开头
面临的挑战: seek 会有杂音
每一次 seek ,就是先调用 AVAudioPlayerNode 的 stop 方法,
把分配 AVAudioPlayerNode 的音频缓冲资源清空,
再把分配音频资源的指针,放到片段开始的地方,重新给 AVAudioPlayerNode 分配需要的音频资的缓冲
最后调用 AVAudioPlayerNode 的 play 方法,又播放起来
挑战的普通解决方法:
关闭 AVAudioPlayerNode 之前,把音量调为 0,就是修改 engine.mainMixerNode.outputVolume
又开始播放了, 把 AVAudioPlayerNode 的音量恢复正常
第 2 种,把分配音频缓冲的角度
把需要的片段音频缓冲,从音频文件中抽离,分配需要的次数给 AVAudioPlayerNode
无杂音
( 上一个,播放到片段结尾,一 seek , 就出杂音 )
具体实现
1,seek 方法途径
控制的数据结构,
-
总共需要重复多少遍, countStdRepeat
-
当前重复了几次,howManyNow
片段播放完后,需要停顿,
-
循环播放多次,停顿 1 次后,可以播放下一个片段了,toClimb
-
音频片段有很多,记录当前的片段序号 currentX
判断当前片段播放完了没有,拿当前的播放时间,该片段的结束时间比较,
用 currentX,找到该片段的结束时间
-
pauseWork, 每一个片段,循环播放完成后,需要停顿一次
-
currentMoment, 记录当前的暂停时刻,过了需要的暂定时间 stdPauseT,继续播放
-
stdPauseT,一轮播放完成后,的暂停持续时间
st