Estoy tratando de enviar datos de audio desde un archivo en el sistema del servidor a un cliente web. El servidor ejecuta Flask y tiene Flask-Sock instalado
sin embargo, en el lado del cliente, aparece un error al intentar decodificar los datos entrantes...
Uncaught (in promise) DOMException: Failed to execute 'decodeAudioData' on 'BaseAudioContext': Unable to decode audio dataServidor
import json import time import wave from app import socket from simple_websocket.ws \ import Base as Websocket CHUNK_SIZE = 10 * 1024 @socket.route("/stream") def audio_stream(ws: Websocket): while ws.connected: raw = ws.receive() message = json.loads(raw) wav = wave.open(message["filename"], "rb") sample_rate = wav.getframerate() data = None complete = False while not complete: if wav.tell() >= wav.getnframes(): complete = True print("frame: " + str(wav.tell())) data = wav.readframes(CHUNK_SIZE) ws.send(data) time.sleep(0.8 * CHUNK_SIZE / sample_rate) wav.close() print("finished streaming!")Cliente
let context; try{ window.AudioContext = window.AudioContext || window.webkitAudioContext context = new AudioContext() }catch(e) { alert('Web Audio API is not supported in this browser') } function get_stream() { const ws = new WebSocket("ws://localhost:5000/stream") ws.onopen = () => { // initially send information to the server to fetch the audio stream ws.send(JSON.stringify({ filename: "example.wav" })) } ws.onmessage = message => { let blob = message.data let reader = new FileReader() reader.readAsArrayBuffer(blob) reader.onload = async () => { let arrayBuffer = reader.result let audioBuffer = await context.decodeAudioData(arrayBuffer) console.log(audioBuffer) // ??? } } } get_stream()¿Tengo que codificarlo de alguna manera antes de enviarlo al navegador? ¿Es algo que estoy haciendo mal en el servidor o no estoy decodificando correctamente?
EDITAR 1:
Parece que puedo decodificar los datos y reproducirlos si envío el archivo completo... que no es realmente lo que quiero, ¿hay alguna forma de decodificar datos parciales y agregarlos a un búfer?