日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

qt实现视频播放器

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt实现视频播放器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇博客介紹如何利用qMediaPlayer和qvideowidget實現視頻文件(avi,mp4....)的播放,并且提供進度顯示,還可以通過拖動進度條來變換播放位置。相關代碼可以在我的資源里下載"基于qt的視頻播放器"

pro文件:

#------------------------------------------------- # # Project created by QtCreator 2018-11-02T20:03:58 # #-------------------------------------------------QT += core gui multimedia multimediawidgetsgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = VideoPlayer TEMPLATE = appSOURCES += main.cpp \videoplayer.cpp \playerslider.cppHEADERS += \videoplayer.h \playerslider.hFORMS += \videoplayer.ui

main.cpp

#include "videoplayer.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);VideoPlayer w;w.show();return a.exec(); }

VideoPlayer是我定義的播放器窗體類。它包括一個QMediaplayer,一個QVideoWidget,一個播放按鈕,一個停止按鈕,一個載入按鈕,和進度條PlayerSlider。VideoPlayer的ui文件外觀如圖:

這里面的PlayerSlider繼承自QSlider,行為定義如下:

#ifndef PLAYERSLIDER_H #define PLAYERSLIDER_H#include <QSlider> #include <QMouseEvent>class PlayerSlider : public QSlider {Q_OBJECT public:PlayerSlider(QWidget * parent = 0);void setProgress(qint64); signals:void sigProgress(qint64); private:bool m_bPressed; protected:void mousePressEvent(QMouseEvent *);void mouseMoveEvent(QMouseEvent *);void mouseReleaseEvent(QMouseEvent *); };#endif // PLAYERSLIDER_H #include "playerslider.h"PlayerSlider::PlayerSlider(QWidget * parent) : QSlider(parent) {m_bPressed = false; }void PlayerSlider::mousePressEvent(QMouseEvent *e) {m_bPressed = true;QSlider::mousePressEvent(e);//必須有這句,否則手動不能移動滑塊 }void PlayerSlider::mouseMoveEvent(QMouseEvent *e) {QSlider::mouseMoveEvent(e);//必須有這句,否則手動不能移動滑塊 }void PlayerSlider::mouseReleaseEvent(QMouseEvent *e) {m_bPressed = false;qint64 i64Pos = value();emit sigProgress(i64Pos);QSlider::mouseReleaseEvent(e);//必須有這句,否則手動不能移動滑塊 }void PlayerSlider::setProgress(qint64 i64Progress) {if(!m_bPressed)setValue(i64Progress); }

這個類的作用有3個:1)接收QMediaPlaer發來的進度信息,更新進度條;2)當用戶操作進度條時,不再讓進度條響應QMediaPlaer發來的進度信息;3)當用戶完成對進度條的拖動后,向QMediaPlaer發送播放位置更新信息。

另一個類是VideoPlayer,行為定義如下:

#ifndef VIDEOPLAYER_H #define VIDEOPLAYER_H#include <QWidget> #include <QtMultimedia> #include <QVideoWidget>namespace Ui { class VideoPlayer; }class VideoPlayer : public QWidget {Q_OBJECTpublic:explicit VideoPlayer(QWidget *parent = 0);~VideoPlayer();bool m_bReLoad; public slots:void OnSetMediaFile(void);void OnSlider(qint64);void OnDurationChanged(qint64);void OnStateChanged(QMediaPlayer::State); private:QVideoWidget * m_pPlayerWidget;QMediaPlayer * m_pPlayer;Ui::VideoPlayer *ui; };#endif // VIDEOPLAYER_H #include "videoplayer.h" #include "ui_videoplayer.h" #include <QFileDialog>VideoPlayer::VideoPlayer(QWidget *parent) :QWidget(parent),ui(new Ui::VideoPlayer) {ui->setupUi(this);m_pPlayer = new QMediaPlayer;m_pPlayerWidget = new QVideoWidget;m_pPlayer->setVideoOutput(m_pPlayerWidget);ui->verticalLayout->addWidget(m_pPlayerWidget);m_pPlayerWidget->setAutoFillBackground(true);QPalette qplte;qplte.setColor(QPalette::Window, QColor(0,0,0));m_pPlayerWidget->setPalette(qplte);//載入connect(ui->BtnLoad, SIGNAL(clicked()), this, SLOT(OnSetMediaFile()));//播放connect(ui->BtnPlay, SIGNAL(clicked()), m_pPlayer, SLOT(play()));//停止connect(ui->BtnStop, SIGNAL(clicked()), m_pPlayer, SLOT(stop()));connect(m_pPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(OnStateChanged(QMediaPlayer::State)));ui->BtnStop->setEnabled(false);//設置滑塊行為m_bReLoad = true;ui->slider->setEnabled(false);connect(m_pPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(OnSlider(qint64)));connect(m_pPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(OnDurationChanged(qint64)));connect(ui->slider, SIGNAL(sigProgress(qint64)), m_pPlayer, SLOT(setPosition(qint64))); }VideoPlayer::~VideoPlayer() {delete m_pPlayer;delete m_pPlayerWidget;delete ui; }void VideoPlayer::OnSetMediaFile(void) {QFileDialog dialog(this);dialog.setFileMode(QFileDialog::AnyFile);QStringList fileNames;if (dialog.exec())fileNames = dialog.selectedFiles();if(!fileNames.empty()){m_pPlayer->setMedia(QUrl::fromLocalFile(fileNames[0]));m_bReLoad = true;ui->slider->setValue(0);} }void VideoPlayer::OnSlider(qint64 i64Pos) {ui->slider->setProgress(i64Pos); }void VideoPlayer::OnDurationChanged(qint64 i64Duration) {if(i64Duration > 0 && m_bReLoad){ui->slider->setRange(0, i64Duration);m_bReLoad = false;} }void VideoPlayer::OnStateChanged(QMediaPlayer::State enumState) {if(QMediaPlayer::StoppedState == enumState){ui->BtnPlay->setEnabled(true);ui->BtnStop->setEnabled(false);ui->slider->setEnabled(false);}else if(QMediaPlayer::PlayingState == enumState){ui->BtnPlay->setEnabled(false);ui->BtnStop->setEnabled(true);ui->slider->setEnabled(true);} }

之所以在他的構造函數里設置QPalette,是因為假如不這樣,在程序啟動時,m_pPlayer不是黑色,而是與背景同樣的顏色,顯得不好看。

顯示效果:

總結

以上是生活随笔為你收集整理的qt实现视频播放器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。