为了账号安全,请及时绑定邮箱和手机立即绑定

最后一课的问题 希望老师回答(关于decodeAudioData是不是异步的问题)

我存了3首歌曲 大概都是4M左右 decodeAudioData大概3秒的样子 当我连续点击了很多首以后 感觉大量buffer囤积在解码部分 每五秒完成一次 导致我的最后一次点击的歌曲要很长时间才能播放 但是看您的视频最后的延时 似乎并没有等待太多时间 是我的代码写的有问题么? 

如果是decodeAudioData同步的问题 那改如何解决? 请老师回答....谢谢


54c379b200019f1105000259.jpg

54c379b20001216705000236.jpg


正在回答

1 回答

好仔细啊,赞!


明白你的意思了,你面临的问题,我也同样面临着!


首先说明:decodeAudioData方法是异步执行的,解码过程是在一个不同于主线程的线程中进行

但是同一个AudioContext对象的decodeAudioData过程是在同一线程中,等待解码的arraybuffer数据会以一个队列的形式在线程中依次进行解码

decodeAudioData方法又必须一次性解码完成才能进行后续动作(成功回调或失败回调),没有类似于onprocess这种过程监听事件,并且webAudio API也没有提供可以阻断解码过程的方法,所以一旦进入解码过程,就必须等待起解码完毕(无论成功或失败)才能进行后续操作

其实webAudio 这些API并不适合(至少目前)播放较大的音频资源,解码播放很小的音乐片段还是很好的,因为解码过程确实太耗时,并且还面临以上问题。


但是嫩,基于你我面临的这个问题我仍然还是尝试过两种解决方案,但都失败了:

一:使用web Worker,但是由于WorkerGlobalScope(worker子线程中的全局对象)中并不存在AudioContext对象,也就没办法在该子线程中解码得到AudioBuffer,并且postMessage方法也不能传递AudioContext这样的对象到子线程中,所以也没办法在该子线程中得到AudioBuffer

二:每次解码数据时都new 一个新的AudioContext实例对象,但由于每次创建AudioContext对象时资源消耗严重,性能极低,并且同一个document中最多只能创建6个,也就是说这个方法也失败了(所以还是记住,一个document中通常只new 一个AudioContext实例对象)


嘿嘿,也真是黔驴技穷了,本人不才,到现在也还没找出什么有效的解决方案,抱歉啦!当然如果你找到什么行之有效的方法,一定私信我哦,感谢!

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

最后一课的问题 希望老师回答(关于decodeAudioData是不是异步的问题)

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信