簡體   English   中英

使用python中的套接字編程將視頻流從服務器發送到客戶端

[英]sending video stream from server to client using socket programming in 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()

您只能在套接字上發送字符串或緩沖區。 框架是一個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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM