python实现多路视频,多窗口播放功能

系列Python开发


文章目录

  • 系列Python开发
  • 前言
  • 一、python实现多路视频播放功能
  • 二、代码实现
    • 1. http申请视频流地址并cv2播放功能
  • 三、打包代码实现
    • 生成可执行文件
  • 总结


前言


一、python实现多路视频播放功能

服务端开发后通常需要做功能测试、性能测试,通常postman、curl等作功能测试使用,长跑服务性能postman并不太适合,如用c++实现播放器功能太慢,效率太低效,本文介绍一种用python来实现多路视频播放的测试。

二、代码实现

1. http申请视频流地址并cv2播放功能

import json
import requests
import time
import threading
from threading import Thread
import signal
import base64
from io import BytesIO
import queue
import random
import sys
from openpyxl import load_workbook
import json
import cv2
import datetime
import os
import shutil
import numpy as np
requests.packages.urllib3.disable_warnings()group_id_base = 31000000452158000001
default_group = 31000000452168000002
username = "admin"
password = "admin123"
sever_ip = "1237.0.0.1"
my_token = "D21DCD7B-9380-CC90-7DA4-673BDE3BF2CF"def allocToken(sever_ip):url = '%s/micplatform/vuds/allocToken' % (sever_ip)print(url)headers = {"Content-Type": "application/json",}data = {"validateMethod": "name+password","username": str(username),"userpassword": str(password),"refreshInterval": 3600,"requestid": "1"}response = requests.post(url, headers=headers, verify=False, data=json.dumps(data))print(response.text)resp = json.loads(response.text)print( "url "+ url +" token: " + str(resp["token"]))return resp["token"]
def AllocStream(deviceId):url = '%s/micplatform/vmd/realplayUrlAlloc' %(sever_ip)headers = {"Content-Type": "application/json",}data = {"requestid": "1","token": my_token,"deviceid": deviceId,"protocol": "http+flv"}try:response = requests.post(url, headers=headers, verify=False, data=json.dumps(data))response.raise_for_status()  # Check for HTTP errorstry:result = response.json()if "playurl" in result:print(f"{deviceId} 申请码流成功 {result['playurl']}")return result['playurl']else:print(f"{deviceId} 申请码流失败 {response.json()}" + my_token)return ""except json.JSONDecodeError:print(f"{deviceId} 响应解析失败:无法解析JSON")return ""except requests.RequestException as e:print(f"{deviceId} 请求失败:{e}")return ""def FreeStream(playurl):url = '%s/micplatform/vmd/realplayUrlRelease' %(sever_ip)headers = {"Content-Type": "application/json",}data = {"requestid": "1","token": my_token,"playurl": playurl}try:response = requests.post(url, headers=headers, verify=False, data=json.dumps(data))response.raise_for_status()  # Check for HTTP errorstry:result = response.json()if "resultDesc" in result and result['resultDesc'] == "成功":print(f"{playurl} 释放码流成功")else:print(f"{playurl} 申请码流失败")except json.JSONDecodeError:print(f"{playurl} 响应解析失败:无法解析JSON" )except requests.RequestException as e:print(f"{playurl} 请求失败:{e}")def openVideo(streamtype,deviceid,stop_event):playurl = AllocStream(deviceid)if len(playurl) == 0:returnif len(playurl) != 0:playurl_array.append(playurl)if (streamtype == 3 or streamtype == 2):cap = cv2.VideoCapture(playurl)else:cap = cv2.VideoCapture(0)while (not stop_event.is_set()):ret, frame = cap.read()  # get a frameif ret == True:# showdate = str(datetime.datetime.now())# font = cv2.FONT_HERSHEY_SIMPLEX# frame = cv2.putText(frame, showdate, (10, 100), font, 0.5, (0, 255, 255), 2, cv2.LINE_AA)cv2.imshow(deviceid, frame)  # show a frameif cv2.waitKey(1) & 0xFF == ord('q'):print("deviceid "+ deviceid + " receive the stop command")stop_event.set()  # 设置事件,通知其他线程停止breakelse:breakcap.release()# 如果你的程序在退出时没有正确关闭所有OpenCV窗口,那么可能是因为cv2.destroyAllWindows()没有在主线程中被调用。在所有线程结束后,确保在主线程中调用# cv2.destroyAllWindows()device_datas = []
stop_event = threading.Event()  # 创建一个事件对象
def AllocStreamTaskByExcelFile(xlsfile):workbook = load_workbook(xlsfile)sheet = workbook.activefor row in sheet.iter_rows(values_only=True):if len(row[0]) != 20 :continueif row[4] != "ON":continueprint("insert davice_data id: ",row[0])device_datas.append(row[0])process_array_in_threads(device_datas)playurl_array = []
def process_array_in_threads(device_datas):print(device_datas)start_time = time.time()threads = []for deviceid in device_datas:thread = threading.Thread(target=openVideo, args=(3,deviceid,stop_event))threads.append(thread)thread.start()print("start task stream "+ deviceid)for thread in threads:thread.join()cv2.destroyAllWindows()for playurl in playurl_array:FreeStream(playurl)playurl_array.clear()if __name__ == '__main__':try:file_path = "config.ini"with open(file_path, 'r') as f:config = json.load(f)if 'serverUrl' in config:sever_ip = config['serverUrl']else:sever_ip = ""print("Please check serverUrl fielddata in config.ini")if 'user' in config:username = config['user']else:username = ""print("Please check username fielddata in config.ini")if 'password' in config:password = config['password']else:password = ""print("Please check password fielddata in config.ini")except FileNotFoundError:print(f"{file_path} does not exist")exit(0)except IOError:print(f"{file_path} exists but is not readable")exit(0)except json.JSONDecodeError:print(f"{file_path} is not a valid JSON file")exit(0)# 配置文件格式检查if not sever_ip or not username or not password:print("Config file is missing required fields. Please check serverUrl, user, password.")exit(0)print("*************************************")print("get server url in config.ini: " + sever_ip)print("get user in config.ini: " + username)print("get password in config.ini: " + password)print("*************************************")my_token = allocToken(sever_ip)print(sever_ip + " get a token is  " + my_token)file = "name2id_vplatform.xlsx"AllocStreamTaskByExcelFile(file)

输入文件 name2id_vplatform.xlsx视频输入资源
配置文件输入参数:config.ini
配置文件输入

三、打包代码实现

基于pycharm软件,安装打包软件

pip install pyinstaller
pyinstaller --onefile main.py
pyinstaller --onefile --distpath dist --out my_application.exe your_script.py--onefile 表示创建一个独立的文件。
--distpath dist 指定输出目录为 dist。
--out my_application 指定输出的文件名为 my_application.exe。
your_script.py 是你想要打包的 Python 脚本。

生成可执行文件

总结

本文实现了最简单最快的方式实现播放器功能,python实现视频播放多路实时流的视频。

授之以鱼不如授之以渔,如果喜欢,请点赞收藏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/69351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【R语言】数据操作

一、查看和编辑数据 1、查看数据 直接打印到控制台 x <- data.frame(a1:20, b21:30) x View()函数 此函数可以将数据以电子表格的形式进行展示。 用reshape2包中的tips进行举例&#xff1a; library("reshape2") View(tips) head()函数 查看前几行数据&…

51单片机之使用Keil uVision5创建工程以及使用stc-isp进行程序烧录步骤

一、Keil uVision5创建工程步骤 1.点击项目&#xff0c;新建 2.新建目录 3.选择目标机器&#xff0c;直接搜索at89c52选择&#xff0c;然后点击OK 4.是否添加起吊文件&#xff0c;一般选择否 5.再新建的项目工程中添加文件 6.选择C文件 7.在C文件中右键&#xff0c;添加…

STM32 软件SPI读写W25Q64

接线图 功能函数 //写SS函数 void My_W_SS(uint8_t BitValue) {GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue); }//写SCK函数 void My_W_SCK(uint8_t BitValue) {GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue); }//写MOSI函数 void My_W_MOSI(uint8_t Bit…

apachePoi中XSSFClientAnchor图片坐标简述;填充多张图片

概述 业务中经常会遇到在单元格内填充图片的需求&#xff0c;而且要求指定图片在单元格内的位置。 一般都是用的apache的poi&#xff0c;设置图片坐标。 HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)dx1 dy1 起始单元…

Centos挂载镜像制作本地yum源,并补装图形界面

内网环境centos7.9安装图形页面内网环境制作本地yum源 上传镜像到服务器目录 创建目录并挂载镜像 #创建目录 cd /mnt/ mkdir iso#挂载 mount -o loop ./CentOS-7-x86_64-DVD-2009.iso ./iso #前面镜像所在目录&#xff0c;后面所挂载得目录#检查 [rootlocalhost mnt]# df -h…

百科词条创建审核不通过的原因有哪些?

我们知道的国内有名的百科网站有百度百科、快懂百科、搜狗百科、360百科,这些有名的百科网站。一般来说,百科的词条排名都是在第一页的,无论是名人、明星、软件、影视名称,还是其他名称,大多排名都在首页,这就拥有了更多的曝光量和流量,而且由于百科是人们获取信息、查找资料的…

ssti学习笔记(服务器端模板注入)

目录 一&#xff0c;ssti是什么 二&#xff0c;原理 所谓模板引擎&#xff08;三列&#xff0c;可滑动查看&#xff09; 三&#xff0c;漏洞复现 1&#xff0c;如何判断其所属的模板引擎&#xff1f; 2&#xff0c;判断清楚后开始注入 &#xff08;1&#xff09;Jinja2&a…

【前端】Python 闭包与JavaScript闭包的实现差异

目录 Python 闭包JavaScript 闭包 推荐超级课程&#xff1a; Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战 Python 闭包 如何定义&#xff1a; 在一个函数内部定义另一个函数&#xff0c;内部函数引用外部函数的变量。 def outer_function(text):…

【JVM详解二】常量池

一、常量池概述 JVM的常量池主要有以下几种&#xff1a; class文件常量池运行时常量池字符串常量池基本类型包装类常量池 它们相互之间关系大致如下图所示&#xff1a; 每个 class 的字节码文件中都有一个常量池&#xff0c;里面是编译后即知的该 class 会用到的字面量与符号引…

人工智能入门 数学基础 线性代数 笔记

必备的数学知识是理解人工智能不可或缺的要素&#xff0c;今天的种种人工智能技术归根到底都建立在数学模型之上&#xff0c;而这些数学模型又都离不开线性代数&#xff08;linear algebra&#xff09;的理论框架。 线性代数的核心意义&#xff1a;世间万事万物都可以被抽象成某…

C# Winform怎么设计串口,客户端和相机控件界面显示

首先我们必须把这个类创建好 INIAPI using System; using System.Text; using System.Runtime.InteropServices;namespace Ini {public class IniAPI{#region INI文件操作/** 针对INI文件的API操作方法&#xff0c;其中的节点&#xff08;Section)、键&#xff08;KEY&#x…

【大数据技术】用户行为日志分析(python+hadoop+mapreduce+yarn+hive)

用户行为日志分析(python+hadoop+mapreduce+yarn+hive) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 本机PyCharm远程连接虚拟机Python 搭建完全分布式高可用大数据集群(MySQL+Hive)

在 Windows 上使用 ZIP 包安装 MySQL 的详细步骤

以下是使用官方 ZIP 包在 Windows 上安装 MySQL 的详细步骤&#xff0c;确保能通过 mysql -uroot -p 成功连接。 步骤 1&#xff1a;下载 MySQL ZIP 包 访问 MySQL 官方下载页面&#xff1a; https://dev.mysql.com/downloads/mysql/选择 Windows (x86, 64-bit), ZIP Archive&…

前端学习-页面尺寸事件以及阻止默认行为(三十三)

目录 前言 页面尺寸事件 语法 检测屏幕宽度 获取宽高 元素尺寸的位置 总结 示例代码 阻止默认行为 阻止冒泡 语法 阻止冒泡如何做 阻止元素默认行为如何做 总结 前言 晚上好各位 页面尺寸事件 会在窗口尺寸改变的时候触发条件 语法 window.addEventListener(…

el-table表格点击单元格实现编辑

使用 el-table 和 el-table-column 创建表格。在单元格的默认插槽中&#xff0c;使用 div 显示文本内容&#xff0c;单击时触发编辑功能。使用 el-input 组件在单元格中显示编辑框。data() 方法中定义了 tableData&#xff0c;tabClickIndex: null,tabClickLabel: ,用于判断是否…

Windows逆向工程入门之汇编环境搭建

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 Visual Studio逆向工程配置 基础环境搭建 Visual Studio 官方下载地址安装配置选项(后期可随时通过VS调整) 使用C的桌面开发 拓展可选选项 MASM汇编框架 配置MASM汇编项目 创建新项目 选择空…

redis专栏解读

本篇起导读、目录的作用&#xff0c;介绍redis专栏涉及的内容以及目录。 redis是我们日常开发中常用的NOSQL数据库&#xff0c;本专栏讲讲解redis的内部实现原理&#xff0c;不会侧重于API的使用&#xff0c;遇到API使用上会简单概括。本专栏大致会分为基础部分&#xff08;数…

【华为OD机考】华为OD笔试真题解析(1)--AI处理器组合

一、题目描述 某公司研发了一款高性能AI处理器&#xff0c;每台物理设备具备8颗AI处理器&#xff0c;编号分别为0、1、2、3、4、5、6、7。 编号0~3的处理器处于同一链路中&#xff0c;编号4~7的处理器处于另外一个链路中&#xff0c;不同链路中的处理器不能通信&#xff0c;如…

网络安全-HSTS

什么是HSTS&#xff1f; HTTP严格传输安全协议&#xff08;HTTP Strict Transport Security&#xff0c;简称&#xff1a;HSTS&#xff09; 是互联网安全策略机制。网站可以选择使用HSTS策略&#xff0c;来让浏览器强制使用HTTPS与网站进行通信&#xff0c;以减少会话劫持风险。…

手写一个C++ Android Binder服务及源码分析

手写一个C Android Binder服务及源码分析 前言一、 基于C语言编写Android Binder跨进程通信Demo总结及改进二、C语言编写自己的Binder服务Demo1. binder服务demo功能介绍2. binder服务demo代码结构图3. binder服务demo代码实现3.1 IHelloService.h代码实现3.2 BnHelloService.c…