gpt4 book ai didi

python - 我正在尝试通过套接字通信在 python 中流式传输视频,但它失败了?

转载 作者:太空宇宙 更新时间:2023-11-03 21:13:15 25 4
gpt4 key购买 nike

我正在尝试通过套接字通信在 python 中流式传输视频,但它失败了?我究竟做错了什么?我的目标是能够用我的网络摄像头捕捉图像,对其进行 sanitizer ,然后通过套接字发送。问题是在接收端我得到这个:

this is supposed to show the received image这是代码:

服务器:

import socket,cv2,pickle                                     
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 9999
serversocket.bind((host, port))
serversocket.listen(5)
while True:
clientsocket,addr = serversocket.accept()
print("Got a connection from %s" % str(addr))
if clientsocket:
vid = cv2.VideoCapture(0)
while(vid.isOpened()):
img, frame = vid.read()

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
print(frame)
a = pickle.dumps(frame)
clientsocket.send(a)

b = pickle.loads(a)
clientsocket.close()

客户:

import socket,cv2,pickle


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


host = socket.gethostname()

port = 9999


s.connect((host, port))

data = []
while True:

packet = s.recv(4096)
if not packet: break
data.append(packet)
k=0
try:
data_arr = pickle.loads(b"".join(data))
print(data_arr)
if k<1:
cv2.imshow('frame',data_arr)
k = k + 1
data=[]
except:
continue
s.close()

提前致谢!

最佳答案

结构是我们的 friend !它是 python 标准库字符串服务的一部分。它将字符串解释为打包的二进制数据,并在 Python 值和表示为 Python 字符串的 C 结构之间执行转换。这有助于处理文件、套接字网络连接和其他来源中的二进制数据。在 server.py 中,帧矩阵被 pickledump 为变量 a 中的字符串,然后使用 struct.pack 添加引用 payloadsize(对于 a 中的字符串)。 payload_size 使用 + 附加到 a 然后 .sendall 发送整个帧。为了简单地解释它,假设我们的框架只是 3x3 矩阵:

frame=np.array([[1,2,3],[4,5,6],[7,8,9]])

a = pickle.dumps(帧)

frame 的 pickle 形式如下所示为字符串:

b'\x80\x03cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02C\x01bq\x03\x87q\x04Rq\x05(K\x01K\x03K\x03\x86q\x06cnumpy\ndtype\nq\x07X\x02\x00\x00\x00i4q\x08K\x00K\x01\x87q\tRq\n(K\x03X\x01\x00\x00\x00

这里 payload_size: len(a) 是 193,它的 4 字节 'L' 格式的字符串表示是 b'\xc1\x00\x00\x00'。然后,message = struct.pack("L", len(a))+a

b'\xc1\x00\x00\x00\x80\x03cnumpy.core.multiarray\n_reconstruct\nq\x00cnumpy\nndarray\nq\x01K\x00\x85q\x02C\x01bq\x03\x87q\x04Rq\x05(K\x01K\x03K\x03\x86q\x06cnumpy\ndtype\nq\x07X\x02\x00\x00\x00i4q\x08K\x00K\x01\x87q\tRq\n(K\x03X\x01\x00\x00\x00

现在消息还包含数据前面的payload_size。 len(消息)= 197。在 client.py 中,s.recv(4096) 意味着最多 4096 个字节将通过阻塞调用接收。数据以每个数据包 4096 字节的形式附加到字符串。其余部分非常明显。我希望这个小小的解释会有所帮助!工作的 server.py 和 client.py 如下供您引用:

服务器.py

    import socket,cv2,pickle
import struct
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 9999
serversocket.bind((host, port))
serversocket.listen(5)

while True:
clientsocket,addr = serversocket.accept()

print("Got a connection from %s" % str(addr))
if clientsocket:
vid = cv2.VideoCapture(0)
while(vid.isOpened()):
img, frame = vid.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
print(frame)
a = pickle.dumps(frame)
message =struct.pack("L", len(a))+a
clientsocket.sendall(message)
cv2.imshow('Transmitted',frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
clientsocket.close()

客户端.py

    import socket,cv2,pickle
import struct
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 9999
s.connect((host, port))
data = b""
payload_size = struct.calcsize("L")
while True:
while len(data) < payload_size:
packet= s.recv(4096)
if not packet: break
data += packet
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L", packed_msg_size)[0]
while len(data) < msg_size:
data += s.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
frame=pickle.loads(frame_data)
cv2.imshow('Received',frame)
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
break
s.close()

关于python - 我正在尝试通过套接字通信在 python 中流式传输视频,但它失败了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51794396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com