udp video transmission python

The UDP protocol, it can be seen from the UDP packet header, UDP is the maximum packet length of 2 ^ 16-1 bytes. Since the UDP header accounts for 8 bytes, and for the encapsulated IP header accounts for 20 bytes in the IP layer, so this is the maximum theoretical length of the UDP packet is 2 ^ 16--1--8--20 = 65507 bytes. If the data packets sent over 65,507 bytes, send or sendto function error code 1 (Operation not permitted, Message too long)

When the video resolution (width * length <65507 time)

Receiving video terminal:

CV2 Import
 from Socket * Import
 from Time Import the ctime, SLEEP 
Import Threading 
Import numpy AS NP 

class ChatRoomPlus: 
    DEF the __init __ (Self): 
        # Global Parameter 
        self.encoding = " UTF-. 8 "   encoding # used 
        self.recvbroadcastPort = 10101   broadcast port # 
        self.sendbroadcastPort = 10102 

        # create broadcast receiver 
        self.recvSocket = Socket (AF_INET, SOCK_DGRAM) 
        self.recvSocket.setsockopt (SOL_SOCKET, the SO_REUSEADDR, . 1 )
        self.recvSocket.setsockopt (SOL_SOCKET, SO_BROADCAST is, . 1 ) 
        self.recvSocket.bind (( '' , self.recvbroadcastPort)) 

        # Create broadcasting transmitter 
        self.sendSocket = Socket (AF_INET, SOCK_DGRAM) 
        self.sendSocket.setsockopt (SOL_SOCKET, SO_BROADCAST, 1 ) 
        self.sendData = None 
        # other 
        self.threads = [] 

    DEF the send (Self): 
        "" " send broadcast " "" 
        self.sendData = " 1 " 
        Print ( " UDP sender successfully started ... ")
        while True:

            self.sendSocket.sendto(self.sendData.encode(self.encoding), ('255.255.255.255', self.sendbroadcastPort))
            #print("【%s】%s:%s" % (ctime(), "", self.sendData))

            #sleep(1)
        self.sendSocket.close()

    def recv(self):
        """接收广播"""

        print("UDP接收器启动成功...")
        cv2.namedWindow('img')
        while True:
            # 接收数据格式:(data, (ip, port))
            recvData, addr = self.recvSocket.recvfrom(400000)
            recvData = np.frombuffer(recvData, dtype=np.uint8)
            if recvData[0]:
                imde = cv2.imdecode(recvData, 1)
                print("imshow........")
                cv2.imshow('img', imde)
                k = cv2.waitKey(1)
                if k == ord('q'):
                    self.sendData="0"
                    break

           # sleep(1)
        self.recvSocket.close()
        cv2.destroyAllWindows()



    def start(self):
        """启动线程"""

        t1 = threading.Thread(target=self.recv)
        t2 = threading.Thread(target=self.send)
        self.threads.append(t1)
        self.threads.append(t2)

        for t in self.threads:
            t.setDaemon(True)
            t.start()

        while True:
            pass


if __name__ == "__main__":
    demo = ChatRoomPlus()
    demo.start()

 

Video sending end:

import cv2
from socket import *
from time import ctime, sleep
import threading


class ChatRoomPlus:
    def __init__(self):
        # 全局参数配置
        self.encoding = "utf-8"  # 使用的编码方式
        self.recvbroadcastPort = 10102   # 广播端口
        self.sendbroadcastPort = 10101
        # 创建广播接收器
        self.recvSocket = socket(AF_INET, SOCK_DGRAM)
        self.recvSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
        self.recvSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
        self.recvSocket.bind(('', self.recvbroadcastPort))
        self.recvData=None

        # 创建广播发送器
        self.sendSocket = socket(AF_INET, SOCK_DGRAM)
        self.sendSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)



        # 其他
        self.threads = []

    def send(self):
        """发送广播"""
        cap = cv2.VideoCapture('ex2.mp4')
        # cap.set(3, 224)
        # cap.set(4, 224)
        print("UDP发送器启动成功...")

        while True:
            print(self.recvData)
            if self.recvData == b'1':
                ret, fra = cap.read()
                if ret:
                    print(ret)
                    _, sendData = cv2.imencode('.jpg', fra)
                    print(sendData.size)
                    print(fra.size)
                    self.sendSocket.sendto(sendData, ('255.255.255.255', self.sendbroadcastPort))

            sleep(1)
        self.sendSocket.close()
        cap.release()

    def recv(self):
        """接收广播"""

        print("UDP接收器启动成功...")
        while True:
            # 接收数据格式:(data, (ip, port))
            self.recvData, addr = self.recvSocket.recvfrom(1024)

            # print("【%s】[%s : %s] : %s" % (ctime(), self.recvData[1][0], self.recvData[1][1], self.recvData[0].decode(self.encoding)))

            #sleep(1)
        self.recvSocket.close()

    def start(self):
        """启动线程"""

        t1 = threading.Thread(target=self.recv)
        t2 = threading.Thread(target=self.send)
        self.threads.append(t1)
        self.threads.append(t2)

        for t in self.threads:
            t.setDaemon(True)
            t.start()

        while True:
            pass


if __name__ == "__main__":
    demo = ChatRoomPlus()
    demo.start()

 

 

参考:https://www.cnblogs.com/purpleraintear/p/6403053.html

https://bbs.csdn.net/topics/392314197?page=1

https://www.cnblogs.com/reader/p/10011666.html

 

Guess you like

Origin www.cnblogs.com/cekong/p/11419880.html