我正在尝试创建一个客户端 - 服务器应用程序,以便在python 2.7中通过UDP发送/接收视频帧。我正在使用cv2从网络摄像头捕获视频帧并将其分解为数据包以通过UDP发送,因为发送完整的图像会导致错误以获得最大传输缓冲区大小。
import cv2
import numpy as np
import socket
import sys
import pickle
import struct
import time
pkSZ = 5000
flag = False
counter = 0
class img_data():
def __init__ (self):
pkid = 0
start = False
data = ""
end = False
pk_size = 0
act_sz = 0
def StartStreamSending():
UDP_IP = "127.0.0.1"
UDP_PORT = 8013
cap = cv2.VideoCapture(0)
clientsocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
clientsocket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, pkSZ*2)
objImg = img_data()
while True:
ret,frame = cap.read()
data = np.array(frame)
dataToSend = pickle.dumps(data)
size = sys.getsizeof(dataToSend)
objImg.act_sz = len(dataToSend)
print "Actual Size : " + str(objImg.act_sz)
if( len(dataToSend) > pkSZ ):
flag = True
counter = 1
sz_send = 0
while (flag == True):
TruncData = (dataToSend[:pkSZ])
objImg.pkid = counter
objImg.start = True
objImg.data = TruncData
objImg.end = False
objImg.pk_size = len(TruncData)
counter += 1
# Send data
clientsocket.sendto(objImg, (UDP_IP, UDP_PORT))
sz_send = sz_send + objImg.size
if( sz_send < (len(dataToSend) - sz_send ) ):
flag = True
elif( sz_send >= len(dataToSend) ):
flag = False
objImg.pkid += counter
objImg.start = False
objImg.data = TruncData
objImg.end = True
objImg.pk_size = len(TruncData)
# Send data
clientsocket.sendto(objImg, (UDP_IP, UDP_PORT))
break
elif( len(dataToSend) < pkSZ ):
flag = False
objImg.pkid += counter
objImg.start = False
objImg.data = TruncData
objImg.end = True
objImg.pk_size = len(TruncData)
# Send data
clientsocket.sendto(objImg, (UDP_IP, UDP_PORT))
time.sleep(5)
StartStreamSending()
在我包含截断数据并发送它的逻辑之后,它正在工作但是如果我尝试将结构作为数据包发送到UDP上,我会收到一个错误,指出要发送的数据需要是字符串而不是实例。
请提供修复或替代方式在python中传输视频。