python - 用于 ive 流的套接字和 Cv2。Python [解释]
问题描述
基本上,我从该站点的一个直播问题中复制了代码。代码是:Server.py
import pickle
import socket
import struct
import cv2
HOST = ''
PORT = 8080
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
s.bind((HOST, PORT))
print('Socket bind complete')
s.listen()
print('Socket now listening')
conn, addr = s.accept()
data = b''
payload_size = struct.calcsize("L")
while True:
# Retrieve message size
while len(data) < payload_size:
data += conn.recv(4096)
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0] ### CHANGED
# Retrieve all data based on message size
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
# Extract frame
frame = pickle.loads(frame_data)
# Display
cv2.imshow('frame', frame)
cv2.waitKey(1)
if 0xFF == ord('d'):
break
客户端.py
import cv2
import numpy as np
import socket
import sys
import pickle
import struct
cap=cv2.VideoCapture(0)
clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect(('localhost',8080))
while True:
ret,frame=cap.read()
# Serialize frame
data = pickle.dumps(frame)
# Send message length first
message_size = struct.pack("L", len(data))
# Then data
clientsocket.sendall(message_size + data)
问题
为什么我们在 client.py 中发送数据长度和帧数据?
server.py 的主 while 循环中发生了什么
在 server.py 的 while 循环中,我们必须使用其他 while 循环。recv
来自客户的数据。
为什么我们不能直接从客户端接收腌制框架并取消它。
为什么我们需要
data
.
并且套接字一次或一个发送所有数据
即使问题看起来太蹩脚也请回答..
解决方案
推荐阅读
- android - 将 3 分量 Android 旋转向量转换为(4 分量)四元数
- excel - 从第一个黑色行开始添加数据
- amazon-web-services - 使用 AWS 从 Spring Boot 微服务项目迁移到无服务器
- python-3.x - 列表理解 - 从不同列表中选择元素
- neo4j - 您如何找到具有恰好 N 个单一类型关系的所有节点?
- android - 尝试安装应用程序 android studio 时 gradle 缓存出错
- python - 替换多索引数据框中的特定值
- c# - 语言总是英文 asp.net core 3.1
- amazon-web-services - 为使用 AWS Fargate 运行的任务分配动态 IP
- amazon-web-services - 我想知道如何使用 aws cli 检查 DatabaseConnections。?