Python實現(xiàn)多路視頻多窗口播放功能
一、python實現(xiàn)多路視頻播放功能
服務(wù)端開發(fā)后通常需要做功能測試、性能測試,通常postman、curl等作功能測試使用,長跑服務(wù)性能postman并不太適合,如用c++實現(xiàn)播放器功能太慢,效率太低效,本文介紹一種用python來實現(xiàn)多路視頻播放的測試。
二、代碼實現(xiàn)
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 errors
try:
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} 響應(yīng)解析失?。簾o法解析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 errors
try:
result = response.json()
if "resultDesc" in result and result['resultDesc'] == "成功":
print(f"{playurl} 釋放碼流成功")
else:
print(f"{playurl} 申請碼流失敗")
except json.JSONDecodeError:
print(f"{playurl} 響應(yīng)解析失?。簾o法解析JSON" )
except requests.RequestException as e:
print(f"{playurl} 請求失?。簕e}")
def openVideo(streamtype,deviceid,stop_event):
playurl = AllocStream(deviceid)
if len(playurl) == 0:
return
if 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 frame
if 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 frame
if cv2.waitKey(1) & 0xFF == ord('q'):
print("deviceid "+ deviceid + " receive the stop command")
stop_event.set() # 設(shè)置事件,通知其他線程停止
break
else:
break
cap.release()
# 如果你的程序在退出時沒有正確關(guān)閉所有OpenCV窗口,那么可能是因為cv2.destroyAllWindows()沒有在主線程中被調(diào)用。在所有線程結(jié)束后,確保在主線程中調(diào)用
# cv2.destroyAllWindows()
device_datas = []
stop_event = threading.Event() # 創(chuàng)建一個事件對象
def AllocStreamTaskByExcelFile(xlsfile):
workbook = load_workbook(xlsfile)
sheet = workbook.active
for row in sheet.iter_rows(values_only=True):
if len(row[0]) != 20 :
continue
if row[4] != "ON":
continue
print("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

配置文件輸入?yún)?shù):config.ini

三、打包代碼實現(xiàn)
基于pycharm軟件,安裝打包軟件
pip install pyinstaller pyinstaller --onefile main.py pyinstaller --onefile --distpath dist --out my_application.exe your_script.py --onefile 表示創(chuàng)建一個獨立的文件。 --distpath dist 指定輸出目錄為 dist。 --out my_application 指定輸出的文件名為 my_application.exe。 your_script.py 是你想要打包的 Python 腳本。

總結(jié)
本文實現(xiàn)了最簡單最快的方式實現(xiàn)播放器功能,python實現(xiàn)視頻播放多路實時流的視頻。
到此這篇關(guān)于Python實現(xiàn)多路視頻多窗口播放功能的文章就介紹到這了,更多相關(guān)Python多路視頻播放內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?include標(biāo)簽的使用方式及說明
這篇文章主要介紹了python?include標(biāo)簽的使用方式及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
使用Python合并Excel文件中的多個Sheet的實現(xiàn)過程
在Python中,可以使用pandas庫來處理Excel文件,將多個工作表(sheets)合并為一個工作表,以下是一個詳細(xì)的代碼示例,展示了如何實現(xiàn)這一功能,文中有相關(guān)的代碼供大家參考,需要的朋友可以參考下2024-10-10
Python基于PyQt5和openpyxl實現(xiàn)Excel單元格合并工具
本文介紹了基于PyQt5和openpyxl的圖形化界面工具,用于合并Excel文件中指定列的相同內(nèi)容單元格,工具提供了文件選擇、工作表選擇、合并設(shè)置、合并執(zhí)行和輸出控制等功能,需要的朋友可以參考下2025-11-11
解決PyCharm IDE環(huán)境下,執(zhí)行unittest不生成測試報告的問題
這篇文章主要介紹了解決PyCharm IDE環(huán)境下,執(zhí)行unittest不生成測試報告的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
python 的 openpyxl模塊 讀取 Excel文件的方法
這篇文章主要介紹了python 的 openpyxl模塊 讀取 Excel文件的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
python學(xué)習(xí)筆記--將python源文件打包成exe文件(pyinstaller)
這篇文章主要介紹了通過將pyinstallerpython源文件打包成exe文件的方法,需要的朋友可以參考下2018-05-05
python實現(xiàn)提取jira bug列表的方法示例
公司要求內(nèi)部每日整理jira bug發(fā)郵件,手動執(zhí)行了一段時間,想著用自動化的方式實現(xiàn),所以本文主要介紹了python實現(xiàn)提取jira bug列表,感興趣的可以了解一下2021-05-05

