#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. как вы решили?