用python中的socket编程从服务器向客户端发送视频流

2024-03-29 15:16:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用python套接字将视频流从服务器发送到客户端,但遇到了错误。 这是我的服务器端和客户端代码。从服务器向客户端发送帧时出现问题

这是我的服务器端代码

    #!/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 

""" 
A simple echo client 
""" 

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() 

Tags: 代码importclientjsonhost客户端datasize
2条回答

只能在套接字上发送字符串或缓冲区。帧是一个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,因为您将有一个较低的延迟。

1)服务器在1次发送后关闭连接,但客户端似乎期望有多个帧

2)SOCK_STREAM(TCP)只支持流而不限制数据包。你需要自己建立划界部分。

3)recvall甚至不是一个函数

也许你应该尝试用远程多处理来实现它: https://docs.python.org/2/library/multiprocessing.html#using-a-remote-manager

相关问题 更多 >