python 基于 websocket 的简单将视频推流到网页
要使用Python实现基于WebSocket的视频推流到网页,你可以使用asgi
框架(如uvicorn
)和websockets
库。以下是一个简单的示例,演示如何将服务器端视频流发送到客户端。
首先,确保安装了必要的库:
pip install uvicorn websockets-stream
然后,创建一个ASGI应用程序来处理WebSocket连接并发送视频流:
import asyncio
from io import BytesIO
from PIL import Image
from websockets import connect, WebSocketServer, WebSocket
from websockets.server import WebSocketServerProtocol
from websockets_streaming.consumer import MediaStreamConsumer
async def echo(websocket: WebSocket, path: str):
consumer = MediaStreamConsumer()
await consumer.connect(websocket)
# 假设你有一个视频源,比如视频文件或摄像头流
# 这里我们用一个生成帧的示例来代替实际视频源
cap = cv2.VideoCapture(0) # 打开摄像头
while True:
ret, frame = cap.read() # 从摄像头读取一帧
if not ret:
break
# 将帧转换为JPEG格式并发送
_, buffer = cv2.imencode('.JPEG', frame)
jpg_image = Image.fromarray(buffer)
byte_io = BytesIO()
jpg_image.save(byte_io, 'JPEG')
await consumer.send_data(byte_io.getvalue())
asyncio.get_event_loop().run_until_complete(
WebSocketServer(echo, '0.0.0.0', 8765).serve_forever()
)
在客户端,你需要一个HTML页面来接收视频流并显示:
<!DOCTYPE html>
<html>
<head>
<title>Video Stream</title>
</head>
<body>
<img id="video-frame" src=""/>
<script>
var ws = new WebSocket("ws://localhost:8765");
ws.binaryType = "arraybuffer";
ws.onmessage = function(event) {
if (event.data instanceof ArrayBuffer) {
var blob = new Blob([event.data], {type: 'image/jpeg'});
var url = URL.createObjectURL(blob);
document.getElementById('video-frame').src = url;
}
};
</script>
</body>
</html>
在服务器端运行uvicorn
命令启动ASGI服务器:
uvicorn asgi:echo --reload
然后,用浏览器打开客户端的HTML页面,你应该能看到摄像头捕捉到的视频流。这个例子使用了websockets-streaming
库来简化流的发送。注意,这个例子仅用于演示目的,实际应用中你需要处理错误,确保视频流的稳定性和安全性。
评论已关闭