您好,我在channels官方文档里按照chat事例改写为一个可以传输视频的方法,但是当多个客户端进行请求时,依旧会卡顿,请问是什么原因造成的?同时自己本地测试时,如果不关闭浏览器重新进入,一段时间后也会卡顿。
以下是一些代码:
# chat/consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer
import cv2
import base64
import numpy as np
class ChatConsumer(AsyncWebsocketConsumer):
# 建立连接
async def connect(self):
self.room_name = self.scope['url_route']['kwargs']['room_name']
self.room_group_name = 'chat_%s' % self.room_name
# Join room group
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name
)
await self.accept()
async def disconnect(self, close_code):
# Leave room group
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name
)
# Receive message from WebSocket
async def receive(self, text_data):
# 将接收到的消息返回给前端
text_data_json = json.loads(text_data)
message = text_data_json['message']
# print(message)
# Send message to room group
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'chat_message',
'message': message
}
)
# Receive message from room group
async def chat_message(self, event):
message = event['message']
message = myTrack(message)
MyPose = finger()
if MyPose != '无操作':
# print(MyPose)
await self.send(json.dumps({
'pose': MyPose
}))
# if MyPose == '握拳' or MyPose == '点击':
# print(MyPose)
# await self.send(json.dumps({
# 'pose': MyPose
# }))
# Send message to WebSocket
await self.send(text_data=json.dumps({
'message': message
}))
from video import HandTrackModel as htm
from collections import deque
detector = htm.handDetector(maxHands=1)
def myTrack(message):
global img
img_data = message.split(',')[1]
img_b64 = base64.b64decode(img_data) # base64解码
img_array = np.frombuffer(img_b64, np.uint8) # 转换np序列
img_np = cv2.imdecode(img_array, cv2.IMREAD_COLOR) # 转换Opencv格式
img = cv2.flip(img_np, 1)
img_hand = detector.findHands(img)
_, encodedImage = cv2.imencode(".jpg", img_hand)
data = np.array(encodedImage)
img_byte = data.tobytes()
# base64编码传输
img_base = base64.b64encode(img_byte).decode()
img_send = "data:image/jpg;base64," + img_base
return img_send
pts = deque(maxlen=2)
def finger():
fingers = None
# 五指张开手的列表
finger_allup = [1, 1, 1, 1, 1]
# 握拳时手的列表
finger_alldow = [0, 0, 0, 0, 0]
# 比1前手的列表
finger_two = [1, 1, 0, 0, 0]
# 比1时手的列表
finger_one = [0, 1, 0, 0, 0]
## 找到手位置坐标
lmList, bbox = detector.findPosition(img)
if len(lmList) != 0:
fingers = detector.fingersUp()
# print(fingers)
pts.append(fingers)
# print('第一帧:'+ str(pts[0]) + '第二帧:' + str(pts[-1]))
if pts[0] == finger_allup and pts[-1] == finger_alldow:
MyPose = '握拳'
# print('握拳')
elif pts[0] == finger_two and pts[-1] == finger_one:
MyPose = '点击'
# print('点击')
else:
MyPose = '无操作'
return MyPose