同一个局域网下,服务器取图片流 发送给客户端 客户端连续展示图片(视频)
在服务器和客户端一对一的情况下,视频流可以正常传送,没有任何问题,
当服务器同时发送视频流给两个或两个以上的客户端时,服务端会出现断流情况,直接导致代码挂掉
服务端:
服务端读取摄像并传送给连接的客户端(可以多个)
python
import socket
import numpy as np
import urllib
import cv2 as cv
import threading
import time
import sys
cap = cv.VideoCapture(0)
cap.set(cv.CAP_PROP_FRAME_WIDTH, 300) # 调窗口的宽度
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 300) # 调窗口的高度
def socket_service():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 防止重启后端口被占用,报错socket.error: [Errno 98] Address already in use)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('192.168.8.33', 9000))
# 绑定服务端ip
s.listen(10)
except Exception as error:
print(error)
sys.exit(1)
print('Waiting connection...')
while True:
conn, addr = s.accept()
t = threading.Thread(target=deal_picture_data, args=(conn, addr))
t.start()
def deal_picture_data(conn, addr):
print('Accept new connection from {0}'.format(addr))
while True:
ret, frame = cap.read()
# '.jpg'表示把当前图片img按照jpg格式编码,按照不同格式编码的结果不一样
img_encode = cv.imencode('.jpg', frame)[1]
data_encode = np.ascontiguousarray(img_encode)
byte_encode = data_encode.tobytes()
encode_len = str(len(str_encode))
try:
conn.send(str_encode)
# 发送图片编码的字节流
except Exception as e:
print(e)
time.sleep(0.1)
conn.close()
socket_service()
客户端:
连接服务端并持续接受服务端发送的照片形成视频
python
import socket
import numpy as np
import cv2
import sys
def socket_client():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.8.33', 9000)) # 连接服务端
except socket.error as msg:
print(msg)
sys.exit(1)
print('this is Client')
while True:
try:
receive_encode = s.recv(77777) # 接收的字节数 最大值 2147483647 (31位的二进制)
nparr = np.frombuffer(receive_encode, dtype='uint8')
img_decode = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
cv2.imshow("Client_show", img_decode)
cv2.waitKey(1)
except Exception as e:
print(e)
socket_client()
相关报错问题:
cv2.error: Unknown C++ exception from OpenCV code
两种情况:
第一:ndarray经过切片后,会出现内存不连续的情况,当不连续时,保存就会报错
第二:python 版本和 opencv 不匹配问题
使用的是 python3.9.7 和 opencv-python==4.5.1.48 可解决
国内镜像快速下载:
python -m pip install opencv-python==4.5.1.48 -i Simple Index