更好的加载器

This commit is contained in:
2023-10-04 10:16:21 +08:00
parent 0e4d68fa89
commit 4f57a19ef6
3 changed files with 69 additions and 29 deletions

View File

@@ -109,40 +109,39 @@
onerror: error => {
console.log('音乐列表错误', error)
},
onload: async (item, sourceBuffer) => {
onload: async item => {
console.log('加载音乐', item)
return await new Promise((resolve) => {
var buffer = new ArrayBuffer(0) // 接收音乐数据
var count = 0 // 接收分片计数
var bufferCursor = 0 // 加载进度
var partlength = 1024 * 64 // 每次加载1MB
// 指针达到音乐数据大小则结束加载
const mediaLoader = async () => {
while (bufferCursor !== item.size) {
if (musicList.audio.paused && musicList.audio.currentTime !== 0) {
console.log('音乐暂停')
break
}
console.log('当前播放进度', musicList.audio.currentTime)
const 当前播放进度 = musicList.audio.currentTime
const 当前结束时间 = sourceBuffer.buffered.length && sourceBuffer.buffered.end(0)
const 剩余数据长度 = buffer.byteLength - bufferCursor
const 本次加载长度 = Math.min(partlength, 剩余数据长度)
const 缓冲时间 = 当前结束时间 - 当前播放进度
if (buffer.byteLength > bufferCursor && !sourceBuffer.updating && 缓冲时间 < 60) {
sourceBuffer.appendBuffer(buffer.slice(bufferCursor, bufferCursor + 本次加载长度))
bufferCursor += 本次加载长度
}
await new Promise((resolve) => setTimeout(resolve, 1000))
}
}
mediaLoader()
//var bufferCursor = 0 // 加载进度
//var partlength = 1024 * 64 // 每次加载1MB
//// 指针达到音乐数据大小则结束加载
//const mediaLoader = async () => {
// while (bufferCursor !== item.size) {
// if (musicList.audio.paused && musicList.audio.currentTime !== 0) {
// console.log('音乐暂停')
// break
// }
// console.log('当前播放进度', musicList.audio.currentTime)
// const 当前播放进度 = musicList.audio.currentTime
// const 当前结束时间 = sourceBuffer.buffered.length && sourceBuffer.buffered.end(0)
// const 剩余数据长度 = buffer.byteLength - bufferCursor
// const 本次加载长度 = Math.min(partlength, 剩余数据长度)
// const 缓冲时间 = 当前结束时间 - 当前播放进度
// if (buffer.byteLength > bufferCursor && !sourceBuffer.updating && 缓冲时间 < 60) {
// sourceBuffer.appendBuffer(buffer.slice(bufferCursor, bufferCursor + 本次加载长度))
// bufferCursor += 本次加载长度
// }
// await new Promise((resolve) => setTimeout(resolve, 1000))
// }
//}
//mediaLoader()
clientList.setChannel(`music-data-${item.id}`, {
onmessage: async (event, client) => {
console.log('收到音乐数据 chunk', count, buffer.byteLength)
buffer = appendBuffer(buffer, event.data)
buffer = appendBuffer(buffer, event.data) // 合并分片准备存储
item.arrayBufferChunks.push(event.data) // 保存分片给边下边播
count++
if (buffer.byteLength >= item.size) {
console.log('音乐数据接收完毕')