您好,登錄后才能下訂單哦!
使用Python怎么實現一個遠程視頻監控程序,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
服務器端代碼如下:
# -*- coding: UTF-8 -*- import socket import time import traceback from VideoCapture import Device import threading # 全局變量 is_sending = False cli_address = ('', 0) # 主機地址和端口 host = '' port = 10218 # 初始化UDP socket ser_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ser_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) ser_socket.bind((host, port)) # 接收線程類,用于接收客戶端發送的消息 class UdpReceiver(threading.Thread): def __init__(self): threading.Thread.__init__(self) self.thread_stop = False def run(self): while not self.thread_stop: # 聲明全局變量,接收消息后更改 global cli_address global is_sending try: message, address = ser_socket.recvfrom(2048) except: traceback.print_exc() continue # print message,cli_address cli_address = address if message == 'startCam': print 'start camera', is_sending = True ser_socket.sendto('startRcv', cli_address) if message == 'quitCam': is_sending = False print 'quit camera', def stop(self): self.thread_stop = True # 創建接收線程 receiveThread = UdpReceiver() receiveThread.setDaemon(True) # 該選項設置后使得主線程退出后子線程同時退出 receiveThread.start() # 初始化攝像頭 cam = Device() cam.setResolution(320,240) # 主線程循環,發送視頻數據 while 1: if is_sending: img = cam.getImage().resize((160,120)) data = img.tostring() ser_socket.sendto(data, cli_address) time.sleep(0.05) else: time.sleep(1) receiveThread.stop() ser_socket.close()
服務器啟動一個子線程,來監聽客戶端發送的消息。當有消息時,將is_sending改為True,則服務器向該客戶端發送視頻數據。具體信息可以看代碼注釋。
客戶端代碼如下:
# -*- coding: UTF-8 -*- import socket, time import pygame from pygame.locals import * from sys import exit # 服務器地址,初始化socket ser_address = ('localhost', 10218) cli_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 設置超時 cli_socket.settimeout(5) # 向服務器發送消息,并判斷接收時是否超時,若超時則重發 while 1: cli_socket.sendto('startCam', ser_address) try: message, address = cli_socket.recvfrom(2048) if message == 'startRcv': print message break except socket.timeout: continue # 此句無用。。防止窗口初始化后等待數據 cli_socket.recvfrom(65536) # 初始化視頻窗口 pygame.init() screen = pygame.display.set_mode((640,480)) pygame.display.set_caption('Web Camera') pygame.display.flip() # 設置時間,可以用來控制幀率 clock = pygame.time.Clock() # 主循環,顯示視頻信息 while 1: try: data, address = cli_socket.recvfrom(65536) except socket.timeout: continue camshot = pygame.image.frombuffer(data, (160,120), 'RGB') camshot = pygame.transform.scale(camshot, (640, 480)) for event in pygame.event.get(): if event.type == pygame.QUIT: cli_socket.sendto('quitCam', ser_address) cli_socket.close() pygame.quit() exit() screen.blit(camshot, (0,0)) pygame.display.update() clock.tick(20)
看完上述內容,你們掌握使用Python怎么實現一個遠程視頻監控程序的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。