1. 程式人生 > >pyqt5+opencv實現視訊播放元件,支援實時流播放

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

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日曆控制元件支援IE6FireFox支援不同語言版本目前支援中英文。

轉自 謝謝! 網上的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開始有音訊焦點機制);播放視訊前需要先請求音訊焦點,暫停視訊、