欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python遠程視頻監(jiān)控程序的實例代碼

 更新時間:2019年05月05日 11:26:20   作者:HackerVirus  
這篇文章主要介紹了Python遠程視頻監(jiān)控程序的實例代碼,需要的朋友可以參考下

老板由于事務繁忙無法經(jīng)常親臨教研室,于是讓我搞個監(jiān)控系統(tǒng),讓他在辦公室就能看到教研室來了多少人。o(>﹏<)o|||

最初我的想法是直接去網(wǎng)上下個軟件,可是找來找去不是有毒就是收費,無奈技術不到家無法破解,只得另尋他法。

正當沒有辦法的時候,我看到一篇博文一個基于python的高速視頻傳輸程序 ,看完茅塞頓開,覺得完全可以自己寫一個,在此感謝作者詹姆斯。

這個程序包括一個服務器和一個客戶端。需要的庫有 VideoCapture 和 pygame,一個用來得到攝像頭的視頻,一個用來顯示。Python庫可以點這里下載:Python Extension Packages。進去后ctrl+F找到相應的庫,然后選擇相應的版本即可,這里還有很多其他的庫可提供下載。

我想到的解決方案是,在教研室開一臺電腦,接一個USB攝像頭,然后開啟一個服務器程序,等待著老板使用客戶端連接,由于是實時視頻傳輸,使用UDP協(xié)議。(主要傳輸部分采用詹姆斯的代碼)。

服務器端代碼如下:

# -*- 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))
# 接收線程類,用于接收客戶端發(fā)送的消息
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
# 創(chuàng)建接收線程
receiveThread = UdpReceiver()
receiveThread.setDaemon(True)   # 該選項設置后使得主線程退出后子線程同時退出
receiveThread.start()
# 初始化攝像頭
cam = Device()
cam.setResolution(320,240)
# 主線程循環(huán),發(fā)送視頻數(shù)據(jù)
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()

服務器啟動一個子線程,來監(jiān)聽客戶端發(fā)送的消息。當有消息時,將is_sending改為True,則服務器向該客戶端發(fā)送視頻數(shù)據(jù)。具體信息可以看代碼注釋。

客戶端代碼如下:

# -*- 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)
# 向服務器發(fā)送消息,并判斷接收時是否超時,若超時則重發(fā)
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
# 此句無用。。防止窗口初始化后等待數(shù)據(jù)
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()
# 主循環(huán),顯示視頻信息
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)

客戶端就是簡單地向服務器發(fā)送啟動消息,接收到回復后開始進入主循環(huán)開始接收視頻數(shù)據(jù)并顯示。

由于UDP協(xié)議不保證信息是否成功到達,因此前面設置了個重發(fā)機制,只有當客戶端收到服務器的回復后,才停止發(fā)送開啟消息并進入主循環(huán)。具體見注釋。

使用時將localhost改成服務器IP即可,目前測試僅適用于局域網(wǎng),校園網(wǎng)。外網(wǎng)暫未測試,熟悉網(wǎng)絡編程的同學可以自行實驗。

經(jīng)驗

調(diào)試的時候出現(xiàn)過服務器怎么都收不到客戶端消息,結果調(diào)試一下午都找不到原因。晚上回來把防火墻、安全軟件全關了,順利通過。

服務器開啟新線程后,由于Python奇怪的設定,主線程退出后子線程得完成后才會退出,而這里子線程又是一個死循環(huán),因此需要對子線程調(diào)用setDaemon(True),這樣主線程退出時子線程也會自動退出。若沒有調(diào)用該方法,調(diào)試一次后第二次可能失敗,因為后臺還有個子線程在運行。

相關文章

  • 解決Tensorflow 使用時cpu編譯不支持警告的問題

    解決Tensorflow 使用時cpu編譯不支持警告的問題

    今天小編就為大家分享一篇解決Tensorflow 使用時cpu編譯不支持警告的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python3中對json格式數(shù)據(jù)的分析處理

    Python3中對json格式數(shù)據(jù)的分析處理

    這篇文章主要介紹了Python3中對json格式數(shù)據(jù)的分析處理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Python json模塊與jsonpath模塊區(qū)別詳解

    Python json模塊與jsonpath模塊區(qū)別詳解

    這篇文章主要介紹了Python json模塊與jsonpath模塊區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • PyQT中QTableWidget如何根據(jù)單元格內(nèi)容設置自動寬度

    PyQT中QTableWidget如何根據(jù)單元格內(nèi)容設置自動寬度

    這篇文章主要介紹了PyQT中QTableWidget如何根據(jù)單元格內(nèi)容設置自動寬度問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python類的定義和使用詳情

    Python類的定義和使用詳情

    這篇文章主要介紹了Python類的定義和使用詳情,在Python中,類表示具有相同屬性和方法的對象的集合,文章圍繞主題相關資料展開更多的相關介紹,需要的小伙伴可以參考一下
    2022-06-06
  • Async?IO在Python中的異步編程工作實例解析

    Async?IO在Python中的異步編程工作實例解析

    這篇文章主要為大家介紹了Async?IO在Python中的異步編程工作實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 跟老齊學Python之Python安裝

    跟老齊學Python之Python安裝

    本文主要講訴了在Linux,Windows,MacOS三大系統(tǒng)中如何安裝Python環(huán)境,非常的實用,雖然前面絮絮叨叨的說了不少題外話,但都是作者的肺腑之言,還是仔細看看吧
    2014-09-09
  • Python最基本的輸入輸出詳解

    Python最基本的輸入輸出詳解

    這篇文章主要介紹了Python最基本的輸入輸出詳解,文中代基于Python2.x,輸入和輸出是Python學習中最基礎的知識,需要的朋友可以參考下
    2015-04-04
  • Pygame實戰(zhàn)之迷宮游戲的實現(xiàn)

    Pygame實戰(zhàn)之迷宮游戲的實現(xiàn)

    玩迷宮游戲長大的我們,欣慰地看到,下一代仍熱愛著這個經(jīng)典游戲。本文將通過Python中的Pygame庫制作這一經(jīng)典的游戲,需要的可以參考一下
    2022-02-02
  • pytorch tensor int型除法出現(xiàn)的問題

    pytorch tensor int型除法出現(xiàn)的問題

    這篇文章主要介紹了pytorch tensor int型除法出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論