awa 可以了

This commit is contained in:
2023-09-30 17:35:38 +08:00
parent 26ede0a73b
commit 07fb6af869
2 changed files with 38 additions and 22 deletions

View File

@ -31,6 +31,41 @@
musicList.on('play', item => {
console.log('播放音乐', item)
})
musicList.on('load', async item => {
await new Promise((resolve) => {
console.log('加载音乐', item)
// 建立一个专用信道, 用于接收音乐数据(接收方已经准备好摘要信息)
var buffer = new ArrayBuffer(0)
var count = 0
clientList.setChannel(`music-data-${item.id}`, {
onmessage: async (event, client) => {
buffer = appendBuffer(buffer, event.data)
console.log('收到音乐数据 chunk', count, buffer.byteLength)
count++
if (buffer.byteLength >= item.size) {
console.log('音乐数据接收完毕')
item.arrayBuffer = buffer
//// 尝试直接播放音乐
//const audioContext = new AudioContext()
//audioContext.decodeAudioData(item.arrayBuffer, async audioBuffer => {
// const mediaStreamDestination = audioContext.createMediaStreamDestination()
// mediaStreamDestination.stream.getAudioTracks().forEach(function (track) {
// client.webrtc.addTrack(track, mediaStreamDestination.stream)
// })
// const audioSource = audioContext.createBufferSource()
// audioSource.buffer = audioBuffer
// audioSource.connect(mediaStreamDestination)
// audioSource.start()
//})
resolve()
}
}
})
// 要求对方从指定信道发送音乐数据
clientList.send('base', JSON.stringify({ type: 'get_music_data', id: item.id, channel: `music-data-${item.id}` }))
//store.put(item) // 只有在like时才保存到本地
})
})
// 初始化客户端列表
const clientList = new ClientList({})
@ -38,7 +73,7 @@
// 缓冲分片发送
const CHUNK_SIZE = 1024 * 128 // 每个块的大小为128KB
const THRESHOLD = 1024 * 1024 // 缓冲区的阈值为1MB
const DELAY = 500 // 延迟500ms
const DELAY = 100 // 延迟500ms
// 将两个ArrayBuffer合并成一个
function appendBuffer(buffer1, buffer2) {
@ -71,26 +106,6 @@
list.filter(item => !ids.includes(item.id)).forEach(item => {
musicList.add(item)
})
// 从获得的列表随机选一个音乐下载
const item = list[Math.floor(Math.random() * list.length)]
console.log('从获得的列表随机选一个音乐下载', item)
// 建立一个专用信道, 用于接收音乐数据(接收方已经准备好摘要信息)
const channel = `music-data-${item.id}`
var buffer = new ArrayBuffer(0)
var count = 0
clientList.setChannel(channel, {
onmessage: async (event, client) => {
buffer = appendBuffer(buffer, event.data)
console.log('收到音乐数据 chunk', count, buffer.byteLength)
count++
if (buffer.byteLength >= item.size) {
console.log('音乐数据接收完毕')
item.ArrayBuffer = buffer
}
}
})
// 要求对方从指定信道发送音乐数据
clientList.send('base', JSON.stringify({ type: 'get_music_data', id: item.id, channel }))
return
}
if (type === 'get_music_data') {

View File

@ -100,8 +100,9 @@ export default class MusicList {
}
async play(item) {
if (!item.arrayBuffer) {
console.log('等待载入缓存:', item)
await this.load(item)
return console.log('等待载入缓存:', item)
console.log('缓存载入完成:', item)
}
this.audio.src = URL.createObjectURL(new Blob([item.arrayBuffer], { type: item.type }))
this.audio.play()