Python远程视频监控

转自:https://www.cnblogs.com/Leo_wl/p/3335877.html

老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人。o(>﹏<)o|||

最初我的想法是直接去网上下个软件,可是找来找去不是有毒就是收费,无奈技术不到家无法破解,只得另寻他法。

正当没有办法的时候,我看到一篇博文 一个基于python的高速视频传输程序 ,看完茅塞顿开,觉得完全可以自己写一个,在此感谢作者詹姆斯。

这个程序包括一个服务器和一个客户端。需要的库有 VideoCapture 和 pygame,一个用来得到摄像头的视频,一个用来显示。Python库可以点这里下载:Python Extension Packages。进去后ctrl+F找到相应的库,然后选择相应的版本即可,这里还有很多其他的库可提供下载。

我想到的解决方案是,在教研室开一台电脑,接一个USB摄像头,然后开启一个服务器程序,等待着老板使用客户端连接,由于是实时视频传输,使用UDP协议。(主要传输部分采用詹姆斯的代码)。

服务器端代码如下:

 1 # -*- coding: UTF-8 -*-
 2
 3 import socket
 4 import time
 5 import traceback
 6 from VideoCapture import Device
 7 import threading
 8
 9 # 全局变量
10 is_sending = False
11 cli_address = (‘‘, 0)
12
13 # 主机地址和端口
14 host = ‘‘
15 port = 10218
16
17 # 初始化UDP socket
18 ser_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
19 ser_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
20 ser_socket.bind((host, port))
21
22 # 接收线程类,用于接收客户端发送的消息
23 class UdpReceiver(threading.Thread):
24     def __init__(self):
25         threading.Thread.__init__(self)
26         self.thread_stop = False
27
28     def run(self):
29         while not self.thread_stop:
30             # 声明全局变量,接收消息后更改
31             global cli_address
32             global is_sending
33             try:
34                 message, address = ser_socket.recvfrom(2048)
35             except:
36                 traceback.print_exc()
37                 continue
38        #     print message,cli_address
39             cli_address = address
40             if message == ‘startCam‘:
41                 print ‘start camera‘,
42                 is_sending = True
43                 ser_socket.sendto(‘startRcv‘, cli_address)
44             if message == ‘quitCam‘:
45                 is_sending = False
46                 print ‘quit camera‘,
47
48     def stop(self):
49         self.thread_stop = True
50
51 # 创建接收线程
52 receiveThread = UdpReceiver()
53 receiveThread.setDaemon(True)           # 该选项设置后使得主线程退出后子线程同时退出
54 receiveThread.start()
55
56 # 初始化摄像头
57 cam = Device()
58 cam.setResolution(320,240)
59
60 # 主线程循环,发送视频数据
61 while 1:
62     if is_sending:
63         img = cam.getImage().resize((160,120))
64         data = img.tostring()
65         ser_socket.sendto(data, cli_address)
66         time.sleep(0.05)
67     else:
68         time.sleep(1)
69
70 receiveThread.stop()
71 ser_socket.close()

服务器启动一个子线程,来监听客户端发送的消息。当有消息时,将is_sending改为True,则服务器向该客户端发送视频数据。具体信息可以看代码注释。

客户端代码如下:

 1 # -*- coding: UTF-8 -*-
 2
 3 import socket, time
 4 import pygame
 5 from pygame.locals import *
 6 from sys import exit
 7
 8 # 服务器地址,初始化socket
 9 ser_address = (‘localhost‘, 10218)
10 cli_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
11
12 # 设置超时
13 cli_socket.settimeout(5)
14
15 # 向服务器发送消息,并判断接收时是否超时,若超时则重发
16 while 1:
17     cli_socket.sendto(‘startCam‘, ser_address)
18     try:
19         message, address = cli_socket.recvfrom(2048)
20         if message == ‘startRcv‘:
21             print message
22             break
23     except socket.timeout:
24         continue
25
26 # 此句无用。。防止窗口初始化后等待数据
27 cli_socket.recvfrom(65536)
28
29 # 初始化视频窗口
30 pygame.init()
31 screen = pygame.display.set_mode((640,480))
32 pygame.display.set_caption(‘Web Camera‘)
33 pygame.display.flip()
34
35 # 设置时间,可以用来控制帧率
36 clock = pygame.time.Clock()
37
38 # 主循环,显示视频信息
39 while 1:
40     try:
41         data, address = cli_socket.recvfrom(65536)
42     except socket.timeout:
43         continue
44     camshot = pygame.image.frombuffer(data, (160,120), ‘RGB‘)
45     camshot = pygame.transform.scale(camshot, (640, 480))
46     for event in pygame.event.get():
47         if event.type == pygame.QUIT:
48             cli_socket.sendto(‘quitCam‘, ser_address)
49             cli_socket.close()
50             pygame.quit()
51             exit()
52     screen.blit(camshot, (0,0))
53     pygame.display.update()
54     clock.tick(20)

客户端就是简单地向服务器发送启动消息,接收到回复后开始进入主循环开始接收视频数据并显示。

由于UDP协议不保证信息是否成功到达,因此前面设置了个重发机制,只有当客户端收到服务器的回复后,才停止发送开启消息并进入主循环。具体见注释。

使用时将localhost改成服务器IP即可,目前测试仅适用于局域网,校园网。外网暂未测试,熟悉网络编程的同学可以自行实验。

经验

调试的时候出现过服务器怎么都收不到客户端消息,结果调试一下午都找不到原因。晚上回来把防火墙、安全软件全关了,顺利通过。

服务器开启新线程后,由于Python奇怪的设定,主线程退出后子线程得完成后才会退出,而这里子线程又是一个死循环,因此需要对子线程调用setDaemon(True),这样主线程退出时子线程也会自动退出。若没有调用该方法,调试一次后第二次可能失败,因为后台还有个子线程在运行。

原文地址:https://www.cnblogs.com/xiaqiuchu/p/11372458.html

时间: 2024-08-02 16:20:11

Python远程视频监控的相关文章

用Python简单制作远程视频监控木马,简单的编程思路我就不吹了!

摘要: 从网上看到过用python远程发送截图的博客,这次我要用python实现远程视频监控,看起来既高大上,做起来又非常简单.先说一说整体思路,我们要做到手机发送邮件,python脚本接收到有特定邮件的信息,模拟鼠标操作点击qq上的视频通话按钮以达到视频监控的目的. 我们需要两个qq号,一个在电脑端登陆,一个在手机端登陆,python脚本需要的账号和密码是你电脑端的.代码所需第三方库:imaplib,pyautogui Imaplib是python的第三方库,我们用它来实现对邮件的操作,pya

用java写一个远程视频监控系统,实时监控(类似直播)我想用RPT协议,不知道怎么把RPT协议集成到项目中

我最近在用java写一个远程视频监控系统,实时监控(类似直播)我想用RPT协议,不知道怎么把RPT协议集成到项目中,第一次写项目,写过这类项目的多多提意见,哪方面的意见都行,有代码或者demo的求赏给我,谢谢

远程视频监控之驱动篇(PWM)

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515237 一.代码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/delay.h> #include <linux/poll.h>

教你怎么搭建远程视频监控系统

时下,越来越多的情况需要应用到远程监控了,在此将刚做好的一个小项目给大家 首先介绍一下硬件方面, 海康威视DS-7016录像机         1台     西部数据SATA接口500G硬盘      1个     TP-LINK R460+路由器           1个    花生壳动态域名专业服务        1年    电源线和视频线随便几百米就够了 第一步搭建你的监控系统 首先将录像机接电源并连接路由器,通过硬盘录像机的默认管理地址进行登陆管理设置,如http://192.168.0

远程视频监控之驱动篇(摄像头)

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515279 一.linux摄像头驱动框架 二.UVC介绍 UVC是USB video class的简称,图像产品在不需要安装任何的驱动程序下即插即用.我们通常所说的免驱摄像头. 免驱并不是说没有,而是大家硬件上都支持UVC这个规范,所以linux中有了一个通用的驱动.所以你再插上你的摄像头就不用下载驱动了,自动加载. 三.驱动分析 1.驱动的注册: 驱动在\drivers\

远程视频监控之驱动篇(串口)

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38638831 由于串口驱动略显复杂,且调试比较困难,我并没有进行重新改写,这里主要是分析一下三星的串口驱动.GSM是通过串口通信的,GSM模块的内容我将在应用篇中讲解.在阅读下面内容时我强烈建议你打开内核的驱动代码,而且为了方便建议你使用Source Insight进行阅读代码.驱动位置:\linux-3.4.91\drivers\tty\serial\samsung.c 由

远程视频监控项目之概览

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38457827 这个项目是假期花费足足办个月才搞定的. 从今天开始我将从0开始介绍我的整个项目,其中包括从开始的构思.实施.再到执行.希望大家能从中有所收获,关于代码和文档,我还在整理,应该在写完这个项目之前能够全部整理完,到时候一并放出. 效果视频:http://v.youku.com/v_show/id_XNzUzMzA1MTg0.html 一.功能介绍 1.视频监控功能

远程视频监控之应用篇(环境搭建)

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515423 这篇主要是讲远程视频监控的环境搭建,中间会设计到网络搭建,也会涉及到一些应用和库的移植. 一.配置内核 1.支持UVC(USB摄像头) make menuconfig <*> Multimedia support  ---> <*>   Video For Linux [*]   Video capture adapters (NEW)  -

远程视频监控之驱动篇(按键)

转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515211 这里我只贴出了代码和应用,没有进行其他的讲解.因为之前我写过的按键驱动的恩恩怨怨,讲解的非常清楚,这个驱动就是根据之前写的改写而成.连接:http://blog.csdn.net/ruoyunliufeng/article/details/23946487 一.代码 #include <linux/module.h> #include <linux/sc