65 lines
1.6 KiB
HTML
65 lines
1.6 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html>
|
||
|
<head>
|
||
|
<title>WebSocket Audio Stream</title>
|
||
|
</head>
|
||
|
<body>
|
||
|
<h1>WebSocket Audio Stream</h1>
|
||
|
<audio id="audioPlayer" controls></audio>
|
||
|
<button onclick="startStream()">Start Stream</button>
|
||
|
<script>
|
||
|
const audioPlayer = document.getElementById('audioPlayer');
|
||
|
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
||
|
const queue = [];
|
||
|
let source = null;
|
||
|
let nextTime = 0;
|
||
|
|
||
|
|
||
|
const processQueue = () => {
|
||
|
if (queue.length > 0) {
|
||
|
const data = queue.shift();
|
||
|
// queue.length=0;
|
||
|
audioContext.decodeAudioData(data.buffer, (buffer) => {
|
||
|
if (!source || nextTime < audioContext.currentTime) {
|
||
|
nextTime = audioContext.currentTime;
|
||
|
}
|
||
|
source = audioContext.createBufferSource();
|
||
|
source.buffer = buffer;
|
||
|
source.connect(audioContext.destination);
|
||
|
// if(audioContext.)
|
||
|
source.start(nextTime);
|
||
|
nextTime += buffer.duration;
|
||
|
},err=>{
|
||
|
console.error('解码失败',err)
|
||
|
});
|
||
|
}
|
||
|
requestAnimationFrame(processQueue);
|
||
|
};
|
||
|
|
||
|
processQueue();
|
||
|
|
||
|
|
||
|
let startStream=()=>{
|
||
|
const ws = new WebSocket('ws://127.0.0.1:8000');
|
||
|
ws.binaryType = 'arraybuffer';
|
||
|
|
||
|
ws.onmessage = (event) => {
|
||
|
const data = new Uint8Array(event.data);
|
||
|
queue.push(data);
|
||
|
};
|
||
|
ws.onopen = () => {
|
||
|
console.log('WebSocket connection established');
|
||
|
};
|
||
|
|
||
|
ws.onclose = () => {
|
||
|
console.log('WebSocket connection closed');
|
||
|
};
|
||
|
|
||
|
ws.onerror = (error) => {
|
||
|
console.error('WebSocket error:', error);
|
||
|
};
|
||
|
}
|
||
|
</script>
|
||
|
</body>
|
||
|
</html>
|