pyqt5+opencv實現視訊播放元件,支援實時流播放
pyqt5+opencv實現視訊播放
(pyqt5網上資料太少,一開始查到用 vlc 做視訊控制元件,走了很多彎路,後面發現 opencv 用來做視訊控制元件更方便,而且opencv 的功能更加全面)
直接貼程式碼
import time
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from cv2 import *
class VideoBox(QWidget):
VIDEO_TYPE_OFFLINE = 0
VIDEO_TYPE_REAL_TIME = 1
STATUS_INIT = 0
STATUS_PLAYING = 1
STATUS_PAUSE = 2
video_url = ""
def __init__(self, video_url="", video_type=VIDEO_TYPE_OFFLINE, auto_play=False):
QWidget.__init__(self)
self.video_url = video_url
self.video_type = video_type # 0: offline 1: realTime
self.auto_play = auto_play
self.status = self.STATUS_INIT # 0: init 1:playing 2: pause
# 元件展示
self.pictureLabel = QLabel()
init_image = QPixmap("../assets/images/no_video.jpeg").scaled(self.width(), self.height())
self.pictureLabel.setPixmap(init_image)
self.playButton = QPushButton()
self.playButton.setEnabled(True )
self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
self.playButton.clicked.connect(self.switch_video)
control_box = QHBoxLayout()
control_box.setContentsMargins(0, 0, 0, 0)
control_box.addWidget(self.playButton)
layout = QVBoxLayout()
layout.addWidget(self.pictureLabel)
layout.addLayout(control_box)
self.setLayout(layout)
# timer 設定
self.timer = VideoTimer()
self.timer.timeSignal.signal[str].connect(self.show_video_images)
# video 初始設定
self.playCapture = VideoCapture()
if self.video_url != "":
self.playCapture.open(self.video_url)
fps = self.playCapture.get(CAP_PROP_FPS)
self.timer.set_fps(fps)
self.playCapture.release()
if self.auto_play:
self.switch_video()
# self.videoWriter = VideoWriter('*.mp4', VideoWriter_fourcc('M', 'J', 'P', 'G'), self.fps, size)
def reset(self):
self.timer.stop()
self.playCapture.release()
self.status = VideoBox.STATUS_INIT
self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
def show_video_images(self):
if self.playCapture.isOpened():
success, frame = self.playCapture.read()
if success:
height, width = frame.shape[:2]
if frame.ndim == 3:
rgb = cvtColor(frame, COLOR_BGR2RGB)
elif frame.ndim == 2:
rgb = cvtColor(frame, COLOR_GRAY2BGR)
temp_image = QImage(rgb.flatten(), width, height, QImage.Format_RGB888)
temp_pixmap = QPixmap.fromImage(temp_image)
self.pictureLabel.setPixmap(temp_pixmap)
else:
print("read failed, no frame data")
success, frame = self.playCapture.read()
if not success and self.video_type is VideoBox.VIDEO_TYPE_OFFLINE:
print("play finished") # 判斷本地檔案播放完畢
self.reset()
self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
return
else:
print("open file or capturing device error, init again")
self.reset()
def switch_video(self):
if self.video_url == "" or self.video_url is None:
return
if self.status is VideoBox.STATUS_INIT:
self.playCapture.open(self.video_url)
self.timer.start()
self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
elif self.status is VideoBox.STATUS_PLAYING:
self.timer.stop()
if self.video_type is VideoBox.VIDEO_TYPE_REAL_TIME:
self.playCapture.release()
self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
elif self.status is VideoBox.STATUS_PAUSE:
if self.video_type is VideoBox.VIDEO_TYPE_REAL_TIME:
self.playCapture.open(self.video_url)
self.timer.start()
self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
self.status = (VideoBox.STATUS_PLAYING,
VideoBox.STATUS_PAUSE,
VideoBox.STATUS_PLAYING)[self.status]
class Communicate(QObject):
signal = pyqtSignal(str)
class VideoTimer(QThread):
def __init__(self, frequent=20):
QThread.__init__(self)
self.stopped = False
self.frequent = frequent
self.timeSignal = Communicate()
self.mutex = QMutex()
def run(self):
with QMutexLocker(self.mutex):
self.stopped = False
while True:
if self.stopped:
return
self.timeSignal.signal.emit("1")
time.sleep(1 / self.frequent)
def stop(self):
with QMutexLocker(self.mutex):
self.stopped = True
def is_stopped(self):
with QMutexLocker(self.mutex):
return self.stopped
def set_fps(self, fps):
self.frequent = fps
if __name__ == "__main__":
app = QApplication(sys.argv)
box = VideoBox("home.mp4")
box.show()
sys.exit(app.exec_())
通過timer根據幀率不停的觸發 show_video_images 方法, 讀取到每一幀資料,將其展示在QLabel中。
本程式碼支援實時流,本地視訊 和 遠端視訊檔案,如需要測試實時流的播放,將視訊 video_url 替換為:
rtmp://live.hkstv.hk.lxdns.com/live/hks
相關推薦
pyqt5+opencv實現視訊播放元件,支援實時流播放
pyqt5+opencv實現視訊播放 (pyqt5網上資料太少,一開始查到用 vlc 做視訊控制元件,走了很多彎路,後面發現 opencv 用來做視訊控制元件更方便,而且opencv 的功能更加全面) 直接貼程式碼 import time import
jsp html5 video實現線上視訊播放原始碼,支援IE6,7,8,10,11,谷歌,火狐等瀏覽器
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getSche
Mediaplayer實現音樂播放器,支援後臺播放
mediaplayer是Android開發中常見的播放音訊檔案的類。這個demo主要實現掃描本地的mp3音訊檔案並支援後臺播放,廢話不多說,直接上程式碼 1,佈局檔案: <?xml version="1.0" encoding="utf-8"?> <LinearLayout
iNeuOS工業互聯平臺,WEB組態(iNeuView)整合rtmp和websocket視訊元件,支援海康、大華等攝像頭實時顯示視訊
目 錄 1. 概述... 1 2. 平臺演示... 2 3.  
vue專案利用vue-video-player實現視訊相容IOS和安卓放大播放
首先,圖片和視訊混合一起,預設圖片製作poster點選彈窗手機播放器 <template> <div class="look-v"> <section class="view-wrap" v-if="accObj"> <div c
使用opencv實現視訊分解圖片和圖片合成視屏
# 視訊分解成圖片 import cv2 cap = cv2.VideoCapture("22.mp4") # 獲取開啟的控制代碼 isOpened = cap.isOpened # 判斷是否開啟 print(isOpened) fps = cap.get(cv2.CAP_PROP_FPS) w
ffmpeg例項,實現視訊對稱效果,鏡面水面效果,上下對稱,左右對稱
上下對稱,水面效果 ffmpeg -i 1.mp4 -filter_complex "[0:v]pad=h=2*ih[a];[0:v]vflip[b];[a][b]overlay=y=h" duichen3.mp4 -y 左右對稱,鏡面效果
proxyme——java NIO實現的http代理,支援https
proxyme 一個http代理 使用java NIO的http代理。支援https。建議不要再chrome上使用本代理,因為chrome本身會請求很多谷歌的api,結果被牆住了,又只有兩個執行緒,導致其他都被阻塞,很尷尬。 之前也打算做過這個東西,結果做出來的有點缺陷(現在想可能是
springboot+mybatis+druid實現多資料來源配置,支援註解和xml兩種sql書寫方式
https://github.com/cheegoday/springboot-demo-djg 要點: 一、依次建立以下幾個Bean 資料來源:DataSource session工廠:SqlSessionFactory 執行緒安全session:Sql
播放語音,支援谷歌瀏覽器自動播放
1.最近的專案用到了語音播放的,呼叫的是百度語音合成語音的介面,接入後發現在谷歌瀏覽器會報錯,其它瀏覽器可以正常播放。 2.通過搜尋瞭解到在Chrome 66以上的最新瀏覽器中,自動播放的視訊要麼是靜音視訊,要麼就是沒有聲音的視訊,或者是使用者手動點選後播放的有聲視訊 3.在HTML5中新增了 <v
Android仿微信朋友圈九宮格圖片展示自定義控制元件,支援縮放動畫~
一直對微信朋友圈九宮格圖片顯示控制元件比較好奇,找到一篇介紹相關騷操作的部落格 部落格雖好但是不夠完美,缺少點選圖片預覽頁面和縮放動畫,作為一個不斷追求完美主義的人,我想把這個控制元件結合到專案中而不是單純作為一個控制元件。 下面是我的實現效果圖: (
vuejs2.0實現分頁元件,使用$emit進行事件監聽資料傳遞
上一篇文章介紹了vuejs實現的簡單分頁,如果我有幾個頁面都需要有分頁效果,不可能每個頁面都去複製一下這段程式碼吧,意思是封裝一下,變成通用的元件。https://segmentfault.com/a/1190000008446707 首先使用基礎 Vue 構造器
使用AOP 實現Redis快取註解,支援SPEL
公司專案對Redis使用比較多,因為之前沒有做AOP,所以快取邏輯和業務邏輯交織在一起,維護比較艱難所以最近實現了針對於Redis的@Cacheable,把快取的物件依照類別分別存放到redis的Hash中,對於key也實現了SPEL支援。1.applicationConte
一個音樂播放器Vue實現(音樂唱片,點選下面播放,中間的圖片可以轉起來。)
https://www.jb51.net/article/134491.htm 需求:做一個類似於下圖所示的音樂唱片,中間暫時用本地圖片,點選下面播放,中間的圖片可以轉起來。 效果: html <div id="musicImage"> <div class="
【JS】封裝相容正版IE9的上傳控制元件,支援圖片格式,圖片大小,圖片寬高驗證,支援非圖片樣式
先廢話一小段,大家好,本人首篇處女作,為什麼要實現一個上傳控制元件呢,必然是公司需要嘛,實現整個過程挺揪心的,因為要解決ie9這個相容性問題,整體來說我前後用了五天的時間來實現。依賴了jquery,其實也可以使用原生編寫,不過想偷偷懶,公司也推薦使用jquery。因為是第一次
java實現html轉pdf,支援中文,css以及中文換行
專案需使用到html轉pdf功能,在網上搜了很多,綜合了不少大神的方法,現在這裡做一個標記,以免自己以後忘記了。 java程式碼 import java.io.File; import java.io.FileOutputStream; import j
一個JavaScript WEB日曆控制元件,支援IE6,FireFox,可支援不同語言版本,目前支援中英文。
轉自 謝謝! 網上的WEB日曆控制元件很多,功能也很強大,可惜大都不支援FireFox,自己閒時寫了一個,有如下特色: 特色: 一、支援IE6,FireFox 二、支援中、英文日曆、可自由擴充套件其它語言 三、遇到Select 下拉框的時候,採取隱藏的方法 四、採用div作為日曆容器,不會被瀏覽器攔截
matlab實現視訊的載入,及各幀的圖片顯示
%這是清除之前空間裡的記憶體變數等等,這個大家應該都知道 fileName='falling.avi' %這是告訴我們的視訊的名字是什麼,變數的定義大家都懂 obj = VideoReader(fileName); %看到沒這裡的“VideoReader”就是2015b版本讀取視訊的語句 numFra
基於tkinter+python36製作得視訊播放器,非會員也可播放
首先附上2個播放地址,可以解析視訊網站,我只是個視訊搬運工,暫時未新增下載功能。 www.wq114.org/weixin.php?url= http://www.wmxz.wang/video.php?url= 兩個網站都可快速解析出視訊播放地址 上圖 t
【bug整理】Android聲音併發問題:播放視訊的時候,用第三方應用播放音樂,存在音視訊聲音併發問題
問題描述:應用播放視訊的時候,開啟第三方音樂應用(如酷狗)隨機播放一首音樂;結果:同時存在視訊聲音和音樂聲音; 這種情況顯然是糟糕的體驗,究其問題原因是播放視訊時沒有對音訊焦點做處理導致(Android 2.2開始有音訊焦點機制);播放視訊前需要先請求音訊焦點,暫停視訊、