lyswhut / lx-music-mobile

一个基于 React native 开发的音乐软件
https://lyswhut.github.io/lx-music-doc/
Apache License 2.0
9.74k stars 1.31k forks source link

预加载下一首歌曲 #508

Open mingcc7 opened 1 month ago

lyswhut commented 1 month ago

看了下,这个实现有一些问题,对于随机切歌模式应该没有效果,而且ts文件间非必要不要用 any,注意 eslint 校验, 现在的实现方式只是将可能播放的下一首提前获取url放到播放器队列中,但放进去的歌曲永远不会被播放,在播放下一曲时放进去的歌曲会被跳过并被清理,现在应该只是提前获取下一首歌的url。由于切换歌曲时马上获取下一首歌曲的url,这可能会加大第三方源服务器的负担, 如果确实要做这个功能,可以考虑在歌曲准备播放结束时才预加载下一首,其他情况都不要预加载,这可以保证播放完毕自动切歌时的衔接及减少多余的url获取操作

mingcc7 commented 1 month ago

@lyswhut

lyswhut commented 1 month ago

playedList专门用于存放随机模式下已播放的歌曲,歌曲被放进去后将会在随机选取歌曲前被剔除, 现在在随机模式下每次播放都会将两首歌放进该列表,也就是说随机模式下只会播放一半的歌曲,然后无歌曲可随机,接着重置已播放列表,你可以打日志看看 至于提前将歌曲推到播放器,它是否会提前加载其他歌曲的数据我没测试过 有什么问题你可以问

mingcc7 commented 1 month ago

@lyswhut 我尝试过没问题,在随机模式下先随机获取下一首歌曲存放在playedList里,那下一首歌曲就直接从playedList里获取了。这和“ 下一首-上一首-下一首”这样的操作一样吧。 if (index < playedList.length) { const playMusicInfo = playedList[index] await pause() setPlayMusicInfo(playMusicInfo.listId, playMusicInfo.musicInfo, playMusicInfo.isTempPlay) await handlePlay() return } 提前将歌曲推到播放器后,我试过断网后下一首歌曲可以播放。

lyswhut commented 1 month ago

忘了当前播放的歌曲若不是已播放列表中的最后一曲时,则从已播放列表取数据的事了,目前这样做确实没问题。 但是还有一些问题,为什么取下一曲要忽略isAutoToggle呢?如果非isAutoToggle,那证明用户在手动切歌,那提前加载的意义就不大了。 还有,getMusicUrl可能会返回缓存的歌曲url,若碰到url已过期并且没有命中歌曲缓存的话,预加载也会不起作用,现在的实现方式主要只对没有url缓存的歌曲有效。 还有,getNext的所有return { musicInfo: null, url: null }都可以改成return null, 这里你可以相信ts的类型推断,if (togglePlayMethod == 'random' && musicInfo && url) 可以改成 if (togglePlayMethod == 'random')

最后,如果确实要做这个功能,我还是希望只有在歌曲准备播放结束(例如还剩30s~15s)时才预加载下一首,其他情况都不要预加载,这可以保证播放完毕自动切歌时的衔接及减少多余的url获取操作,这个功能做得太随便会导致获取url的调用操作翻倍,这个问题是要主要考虑的。