使用Python的套接字编程从服务器向客户端发送视频流

0 投票
2 回答
16299 浏览
提问于 2025-04-21 01:24

我正在尝试使用Python的socket库从服务器向客户端发送视频流,但遇到了一些错误。以下是我在服务器和客户端的代码。看起来在从服务器发送帧到客户端时出现了一些问题。

这是我的服务器端代码

    #!/usr/bin/env python 



import socket 

import cv2

import json

host = ' ' 

port = 50058

backlog = 5 

size = 1024 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
**strong text**s.bind((host,port)) 
s.listen(backlog) 

vc=cv2.VideoCapture(0)    
if vc.isOpened():

    rval, frame = vc.read()

while 1: 

    client, address = s.accept()
    rval, frame = vc.read()

    #data = client.recv(size) 
    if rval:  
        #print "recieved data " + str(data)
        #print "sending data to %s" % str(address)

        #p=json.dumps(frame)
        client.send(frame) 
    client.close()

这是客户端代码

#!/usr/bin/env python """ 一个简单的回声客户端 """ import socket import cv2 import json host = '169.254.132.51' port = 50058 size = 1024000000 cv2.namedWindow("preview") s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host,port)) while True: data = s.recv() #frame=json.loads(data) cv2.imshow("preview", data) s.close()

2 个回答

1

1) 服务器在发送一次后就关闭了连接,但客户端似乎期待能接收到多个数据包。

2) SOCK_STREAM(TCP)只支持一个数据流,没有分隔数据包的功能。你需要自己来处理这些分隔。

3) recvall 甚至不是一个函数。

也许你可以尝试用远程多进程来实现这个功能:https://docs.python.org/2/library/multiprocessing.html#using-a-remote-manager

4

你只能通过套接字发送字符串或者缓冲区。Frame是一个numpy数组,你需要先把它转换成字符串。可以使用下面的代码来进行转换。

frame = frame.flatten()
data = frame.tostring()

通过网络发送数据

在另一端,你可以使用

frame = numpy.fromstring(data, dtype=numpy.uint8)
frame = numpy.reshape(frame, (240,320,3))

将数据转换回可以传递给cv2.imshow()的帧。

我建议使用UDP而不是TCP,因为这样延迟会更低。

撰写回答