最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

服務(wù)器端代碼如下:

# -*- coding: UTF-8 -*-
import socket
import time
import traceback
from VideoCapture import Device
import threading
# 全局變量
is_sending = False
cli_address = ('', 0)
# 主機(jī)地址和端口
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)   # 該選項(xiàng)設(shè)置后使得主線程退出后子線程同時(shí)退出
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()

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

客戶端代碼如下:

# -*- coding: UTF-8 -*-
import socket, time
import pygame
from pygame.locals import *
from sys import exit
# 服務(wù)器地址,初始化socket
ser_address = ('localhost', 10218)
cli_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 設(shè)置超時(shí)
cli_socket.settimeout(5)
# 向服務(wù)器發(fā)送消息,并判斷接收時(shí)是否超時(shí),若超時(shí)則重發(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()
# 設(shè)置時(shí)間,可以用來控制幀率
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)

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

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

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

經(jīng)驗(yàn)

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

服務(wù)器開啟新線程后,由于Python奇怪的設(shè)定,主線程退出后子線程得完成后才會(huì)退出,而這里子線程又是一個(gè)死循環(huán),因此需要對(duì)子線程調(diào)用setDaemon(True),這樣主線程退出時(shí)子線程也會(huì)自動(dòng)退出。若沒有調(diào)用該方法,調(diào)試一次后第二次可能失敗,因?yàn)楹笈_(tái)還有個(gè)子線程在運(yùn)行。

相關(guān)文章

  • Python?獲取今天任意時(shí)刻的時(shí)間戳的方法

    Python?獲取今天任意時(shí)刻的時(shí)間戳的方法

    本文主要介紹了Python?獲取今天任意時(shí)刻的時(shí)間戳的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-06-06
  • Python操作MySQL簡(jiǎn)單實(shí)現(xiàn)方法

    Python操作MySQL簡(jiǎn)單實(shí)現(xiàn)方法

    這篇文章主要介紹了Python操作MySQL簡(jiǎn)單實(shí)現(xiàn)方法,通過一個(gè)簡(jiǎn)單的實(shí)例講述了Python針對(duì)mysql數(shù)據(jù)庫(kù)的增刪改查技巧,需要的朋友可以參考下
    2015-01-01
  • Python二叉樹初識(shí)(新手也秒懂!)

    Python二叉樹初識(shí)(新手也秒懂!)

    二叉樹是一種簡(jiǎn)單的樹形結(jié)構(gòu),其每個(gè)節(jié)點(diǎn)的分支節(jié)點(diǎn)數(shù)有0,1或2個(gè),下面這篇文章主要給大家介紹了關(guān)于Python二叉樹的相關(guān)資料,本文介紹的非常通俗易懂,新手也秒懂,需要的朋友可以參考下
    2022-05-05
  • python程序主動(dòng)退出進(jìn)程的五種方式

    python程序主動(dòng)退出進(jìn)程的五種方式

    對(duì)于如何結(jié)束一個(gè)Python程序或者用Python操作去結(jié)束一個(gè)進(jìn)程等,Python本身給出了好幾種方法,而這些方式也存在著一些區(qū)別,對(duì)相關(guān)的幾種方法看了并實(shí)踐了下,同時(shí)也記錄下,需要的朋友可以參考下
    2024-02-02
  • 淺析PyCharm 的初始設(shè)置(知道)

    淺析PyCharm 的初始設(shè)置(知道)

    這篇文章主要介紹了PyCharm 的初始設(shè)置(知道),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Python OpenCV 使用滑動(dòng)條來調(diào)整函數(shù)參數(shù)的方法

    Python OpenCV 使用滑動(dòng)條來調(diào)整函數(shù)參數(shù)的方法

    這篇文章主要介紹了Python OpenCV 使用滑動(dòng)條來調(diào)整函數(shù)參數(shù)的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python+selenium+chrome實(shí)現(xiàn)淘寶購(gòu)物車秒殺自動(dòng)結(jié)算

    python+selenium+chrome實(shí)現(xiàn)淘寶購(gòu)物車秒殺自動(dòng)結(jié)算

    這篇文章主要介紹了python+selenium+chrome實(shí)現(xiàn)淘寶購(gòu)物車秒殺自動(dòng)結(jié)算,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 使用Python實(shí)現(xiàn)獲取Apollo配置

    使用Python實(shí)現(xiàn)獲取Apollo配置

    Apollo是一款可靠的分布式配置管理中心,能夠集中化管理應(yīng)用不同環(huán)境、不同集群的配置,本文將介紹如何在Python項(xiàng)目中輕松獲取和使用Apollo配置中心的配置信息,需要的可以參考下
    2024-11-11
  • 使用python監(jiān)測(cè)網(wǎng)絡(luò)連接和網(wǎng)速的實(shí)現(xiàn)代碼

    使用python監(jiān)測(cè)網(wǎng)絡(luò)連接和網(wǎng)速的實(shí)現(xiàn)代碼

    在我們?nèi)粘I钪芯W(wǎng)絡(luò)連接和網(wǎng)速在工作中非常重要,本文將介紹如何使用Python程序來監(jiān)測(cè)互聯(lián)網(wǎng)連接的速度和中斷情況,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Python定義函數(shù)時(shí)參數(shù)有默認(rèn)值問題解決

    Python定義函數(shù)時(shí)參數(shù)有默認(rèn)值問題解決

    這篇文章主要介紹了Python定義函數(shù)時(shí)參數(shù)有默認(rèn)值問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

界首市| 泸西县| 阳曲县| 自治县| 嘉定区| 宁都县| 隆昌县| 鹤庆县| 昌都县| 巴林右旗| 长顺县| 儋州市| 大田县| 邛崃市| 南木林县| 宜君县| 青阳县| 通化县| 和政县| 梁平县| 潢川县| 梨树县| 汉寿县| 股票| 遂溪县| 玉田县| 民县| 乐山市| 偏关县| 乐陵市| 祁连县| 延吉市| 伊川县| 南宁市| 汉沽区| 白山市| 资溪县| 桓台县| 辉县市| 南乐县| 南昌市|