在python

时间:2017-02-01 16:08:10

标签: python python-2.7 client-server structure video-capture

我正在尝试创建一个客户端 - 服务器应用程序,以便在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中传输视频。

0 个答案:

没有答案