繁体   English   中英

使用Python中的套接字发送帧

[英]Sending frames using sockets in Python

我正在尝试从客户端获取帧,将其发送到服务器,然后从那里将其写入视频。 但是我一直发送失败,在out.write(frame) TypeError: Expected Ptr<cv::UMat> for argument '%s'错误的TypeError: Expected Ptr<cv::UMat> for argument '%s'

我也尝试过使用pickle.dumps(frame) ,然后在服务器端加载它,但它一直被截断。

服务器:

import numpy as np 
import cv2, socket

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter("output.avi", fourcc, 19.0, (1366, 768))

s = socket.socket()
host = socket.gethostname()
port = 8080
s.bind((host,port))
s.listen(1)
print(host)
print("Waiting for any incoming connections ... ")
conn, addr = s.accept()
print(addr, "Has connected to the server")

while True:
    frame = conn.recv(1024)
    # write frame to video writer
    out.write(frame)

    if cv2.waitKey(1) == 27:
        break

out.release()
cv2.destroyAllWindows()

客户:

import numpy as np 
import cv2, socket
from PIL import ImageGrab

s = socket.socket()
host = input(str("Please enter the host address of the sender : "))
port = 8080
s.connect((host,port))
print("Connected ... ")


while True:
    img = ImageGrab.grab()
    img_np = np.array(img)
    frame = img_np
    s.send(frame)

显然在服务器中,frame变为<class 'bytes'> 因此,我正在尝试找到解决此问题的任何方法,包括以某种方式将字节转换回ndarray,或找到任何其他解决方法。

谢谢。

让您将问题分为两个部分:

  1. 如何通过套接字发送数据?
    您正在使用具有1024字节缓冲区的套接字,这意味着在每次迭代中,您最多可以获得1024字节的数据。
    在低级网络中工作时,应该做的是在帧的末尾放置一个唯一的结束标识符令牌,并使用.recv()在服务器端进行迭代,直到到达为止。 另一种选择是发送消息的长度并计算接收到的字节数。 这样,当您拥有完整的帧时,就可以中断while循环,将其转换为numpy数组,并对其进行.write()。

  2. 如何通过网络传递numpy数组?

    • 您可以对其进行腌制并将字节传输到io.BytesIO流中。 然后使用np.load()函数加载流。
    • 您还可以将帧像素序列化为像素类型的数组,将其从套接字读取到io.BytesIO中,然后使用np.fromfile(...,dtype = ...)读取到numpy中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM