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…

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…

在 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&…

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汇编项目 创建新项目 选择空…

手写一个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…

DeepSeekMoE 论文解读:混合专家架构的效能革新者

论文链接&#xff1a;DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models 目录 一、引言二、背景知识&#xff08;一&#xff09;MoE架构概述&#xff08;二&#xff09;现有MoE架构的问题 三、DeepSeekMoE架构详解&#xff08;一&a…

[每周一更]-(第133期):Go中MapReduce架构思想的使用场景

文章目录 **MapReduce 工作流程**Go 中使用 MapReduce 的实现方式&#xff1a;**Go MapReduce 的特点****哪些场景适合使用 MapReduce&#xff1f;**使用场景1. 数据聚合2. 数据过滤3. 数据排序4. 数据转换5. 数据去重6. 数据分组7. 数据统计8.**统计文本中单词出现次数****代码…

【C++高并发服务器WebServer】-13:多线程服务器开发

本文目录 一、多线程服务器开发二、TCP状态转换三、端口复用 一、多线程服务器开发 服务端代码如下。 #include <stdio.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <pthread.h>s…

「vue3-element-admin」告别 vite-plugin-svg-icons!用 @unocss/preset-icons 加载本地 SVG 图标

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

C#中深度解析BinaryFormatter序列化生成的二进制文件

C#中深度解析BinaryFormatter序列化生成的二进制文件 BinaryFormatter序列化时,对象必须有 可序列化特性[Serializable] 一.新建窗体测试程序BinaryDeepAnalysisDemo,将默认的Form1重命名为FormBinaryDeepAnalysis 二.新建测试类Test Test.cs源程序如下: using System; us…

深度学习在医疗影像分析中的应用

引言 随着人工智能技术的快速发展&#xff0c;深度学习在各个领域都展现出了巨大的潜力。特别是在医疗影像分析中&#xff0c;深度学习的应用不仅提高了诊断的准确性&#xff0c;还大大缩短了医生的工作时间&#xff0c;提升了医疗服务的质量。本文将详细介绍深度学习在医疗影像…