我正在开发一个项目,其中使用 FastAPI 来处理 WebSocket 连接,以从媒体记录器接收视频 blob。目标是创建大小限制为 5 MB 的视频部分并将它们保存为单独的文件。初始部分运行良好,但后续部分似乎已损坏,并且我面临播放问题。
我尝试在循环内处理缓冲和文件写入,并且我怀疑我管理文件操作的方式可能会导致损坏。有人可以检查我的代码并提供有关为什么后续视频部分无法播放的见解吗?
以下是相关代码片段:
//frontend
recorder.ondataavailable = (e: BlobEvent) => {
socket.send(e.data)
}
recorder.start(1000)
@app.websocket("/video")
async def websocket_endpoint(websocket: WebSocket, token: str = Query(...), videoId: str = Query(...), authorize: AuthJWT = Depends()):
await manager.connect(websocket)
temp_dir = os.path.join("temp", videoId)
os.makedirs(temp_dir, exist_ok=True)
queueNumber = 1
bufferedSize = 0
totalRequiredBufferSize = 5 * 1024 * 1024
print(f"{datetime.utcnow()}: Client connected: {websocket.client.host}")
try:
while True:
try:
data = await websocket.receive_bytes()
file = open(os.path.join(temp_dir, f"{videoId}-video-{queueNumber}.webm"), 'ab')
if bufferedSize < totalRequiredBufferSize:
if data:
file.write(data)
bufferedSize = bufferedSize + len(data)
print(f"buffered size = {bufferedSize} and blob size = ${len(data) / (1024 * 1024)}")
elif bufferedSize >= totalRequiredBufferSize:
if data:
file.write(data)
print(f"End= {queueNumber} and blob size = ${bufferedSize / (1024 * 1024)}")
file.close()
bufferedSize = 0
queueNumber = queueNumber + 1
except WebSocketDisconnect:
print(f"Client disconnected: {websocket.client.host}")
manager.disconnect(websocket)
我很感激有关如何在 FastAPI WebSocket 循环中正确处理文件操作的任何建议或指导,尤其是在处理 Media Recorder blob 时。
谢谢!
没有任何内容被损坏,只是你不能随意剪切文件并期望它能够工作。你已经切断了所有的初始化信息。
此外,您也无法剪切 MediaRecorder 数据事件数据。它意味着是一个连续的流,数据事件只是给你一些方便大小的块......它们不一定是段(即使在实践中,它们基本上是)。
每种容器格式都有自己的处理方法。对于 WebM,请参阅我之前的答案:https://stackoverflow.com/a/62237720/362536