片段循环播放器的两种实现思路

本文探讨了两种实现音频片段循环播放的方法。第一种利用seek方法,但面临seek产生杂音的挑战,解决方案是调整音量。第二种方法从缓冲角度出发,避免了杂音问题。具体实现包括通过控制数据结构实现片段重复和停顿,以及使用extract buffer抽取音频缓冲。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给一个 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值