Python 使用OpenCV和Raspberry Pi中的套接字通过TCP发送视频
我一直在尝试从我的客户端(Raspberry Pi)向笔记本电脑上的服务器发送实时视频帧。这两个设备都连接到同一个网络 Server.pyPython 使用OpenCV和Raspberry Pi中的套接字通过TCP发送视频,python,sockets,opencv,raspberry-pi,client-server,Python,Sockets,Opencv,Raspberry Pi,Client Server,我一直在尝试从我的客户端(Raspberry Pi)向笔记本电脑上的服务器发送实时视频帧。这两个设备都连接到同一个网络 Server.py import socket import sys import cv2 import pickle import numpy as np import struct HOST = '192.168.1.3' PORT = 8083 s=socket.socket(socket.AF_INET, socket.SOCK_STREAM) print 'Soc
import socket
import sys
import cv2
import pickle
import numpy as np
import struct
HOST = '192.168.1.3'
PORT = 8083
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'
s.bind((HOST, PORT))
print 'Socket bind complete'
s.listen(10)
print 'Socket now listening'
conn, addr = s.accept()
data = ""
payload_size = struct.calcsize("L")
while True:
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]
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
frame=pickle.loads(frame_data)
print frame.size
# cv2.imshow('frame', frame)
# cv2.waitKey(10)
我的笔记本电脑服务器未接收任何数据。但当我在相同的设备上运行这个客户机和服务器(例如,笔记本电脑上的服务器和客户机)时,它工作正常
我能够将数据从树莓发送到笔记本电脑(针对echo应用程序进行了测试)
有人能帮我吗?根据我的理解,客户端和服务器应该使用相同的端口,但使用的是两个不同的端口,8083和8081
您是否已检查所用端口的防火墙是否已打开?经过数小时的分析,为什么server.py和client.py无法工作(即使在禁用防火墙之后),server.py代码中出现错误:“word不应是字符串”。因此,word=“”(这是一个字符串)应更改为word=b“”(这两个单引号表示一个字节) 使用下面的代码创建一个文件,例如,在Windows上的Powershell中运行服务器代码
python“C:\path\toFile\streamTestServer.py”
代码是:
import socket
import sys
import cv2
import pickle
import numpy as np
import struct
HOST = '127.0.0.1'
PORT = 8083
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
s.bind((HOST, PORT))
print('Socket bind complete')
s.listen(10)
print('Socket now listening')
conn, addr = s.accept()
data = b''
payload_size = struct.calcsize("L")
while True:
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]
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
frame=pickle.loads(frame_data)
print(frame.size)
cv2.imshow('frame', frame)
cv2.waitKey(10)
现在您正在从localhost客户端流式传输到localhost服务器。使用相同的程序,我在接收raspberry pi上的数据时遇到问题。我发现这是因为不同机器上使用“L”表示无符号long的方式不同。至少对我来说,它们在不同机器上的本机表示是不同的。我通过在格式字符串中添加一个“=”来修复这个问题,以强制struct使用标准大小的“L”(4)解包 及
等等我不明白为什么你要用TCP来进行视频流,而不是UDP,因为UDP是专门用于这种用途的。即使我把端口号放在同一个位置上,问题仍然是一样的。所有防火墙规则都允许在该端口上进行连接。您是否检查过主机的实际IP(由ipconfig获得)是否与您在程序中使用的IP相同?ping在两个方向都有效吗?我遇到的问题是服务器中的“有效负载大小”得到了一个非常大的值(789874543132138489797974964),因此程序处于无限循环中。您能分享完整的代码吗?我在你的server.py代码中看不到“word=”你说得对,在这个小改动生效后,谢谢!
import socket
import sys
import cv2
import pickle
import numpy as np
import struct
HOST = '127.0.0.1'
PORT = 8083
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print('Socket created')
s.bind((HOST, PORT))
print('Socket bind complete')
s.listen(10)
print('Socket now listening')
conn, addr = s.accept()
data = b''
payload_size = struct.calcsize("L")
while True:
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]
while len(data) < msg_size:
data += conn.recv(4096)
frame_data = data[:msg_size]
data = data[msg_size:]
frame=pickle.loads(frame_data)
print(frame.size)
cv2.imshow('frame', frame)
cv2.waitKey(10)
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(('127.0.0.1', 8083))
while True:
ret,frame = cap.read()
data = pickle.dumps(frame)
clientsocket.sendall(struct.pack("L", len(data)) + data)
payload_size = struct.calcsize("=L")
clientsocket.sendall(struct.pack("=L", len(data)) + data)