Лучший способ потоковой передачи аудиоданных между браузером и FastAPI

#sockets #websocket #fastapi

#сокеты #websocket #fastapi

Вопрос:

У меня есть некоторый базовый серверный и клиентский код с помощью FastAPI, но я пытаюсь найти наилучший способ считывания этих данных для живого приложения, которое выполняет некоторую обработку звука. Я не уверен, как подойти к этому, поскольку FastAPI может считывать данные с клиента только в байтах. Должен ли я вообще преобразовывать его в большой двоичный объект после записи? Может быть, использовать HTTP для простоты (просто создать прототип, чтобы он не был оптимальным)? Я также читал о RTSP, но, похоже, не могу найти для этого хороших ресурсов, поэтому я был бы признателен за какой-нибудь способ указать мне правильное направление. Спасибо за любые советы!

Клиент

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>helloworld</h1>

    <script>
        var ws = new WebSocket("ws://localhost:8000/ws", 'echo-protocol');
        navigator.mediaDevices.getUserMedia({ audio: true })
            .then(stream => {
                const mediaRecorder = new MediaRecorder(stream);
                mediaRecorder.start(5000);

                mediaRecorder.addEventListener("dataavailable", event => {
                    console.log("sending audio");
                    const audioBlob = new Blob([event.data], {type: 'audio/mp3'});
                    ws.send(audioBlob);
                    console.log("sent audio");
                });
            });
    </script>
</body>
</html> 
 

Сервер

 from fastapi import FastAPI, WebSocket, Request
from fastapi.templating import Jinja2Templates


app = FastAPI()
templates = Jinja2Templates(directory="templates")


@app.get("/")
def read_root(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})


@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_bytes()
 

Комментарии:

1. как вы решили?