udp 視頻傳輸 python


根據UDP協議,從UDP數據包的包頭可以看出,UDP的最大包長度是2^16-1的個字節。由於UDP包頭占8個字節,而在IP層進行封裝后的IP包頭占去20字節,所以這個是UDP數據包的最大理論長度是2^16 - 1 - 8 - 20 = 65507字節。如果發送的數據包超過65507字節,send或sendto函數會錯誤碼1(Operation not permitted, Message too long)

當視頻分辨率(長*寬<65507時)

接收視頻端:

import cv2 from socket import *
from time import ctime, sleep import threading import numpy as np class ChatRoomPlus: def __init__(self): # 全局參數配置 self.encoding = "utf-8" # 使用的編碼方式 self.recvbroadcastPort = 10101 # 廣播端口 self.sendbroadcastPort = 10102 # 創建廣播接收器 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.sendSocket = socket(AF_INET, SOCK_DGRAM) self.sendSocket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1) self.sendData=None # 其他 self.threads = [] def send(self): """發送廣播""" self.sendData = "1" print("UDP發送器啟動成功...") 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()

 

視頻發送端:

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM