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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Qt 简单的视频播放器

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

1. 簡述

一個簡單的視頻播放器,包含暫停、停止、音量、播放時間、拖進等功能,界面未經過美化,純功能例子

2.簡單分析

2.1.視頻播放器的兩個主體

  • 播放器 QVideoWidget
  • 播放對象 QMediaPlayer
  • 2.2.播放對象的屬性

  • 視頻時長 duration() //return qint64 毫秒值
  • 當前播放的時長 position() //return qint64 毫秒值
  • 視頻當前音量 volume() //return qint64 毫秒值
  • 是否靜音 isMuted() return bool
  • 對應的有

  • 沒有
  • setPosition(qint64) //可以用來跳轉到某個時間點
  • setVolume() //設置音量
  • setMuted(bool) //設置是否靜音
  • 2.3 播放對象的狀態

  • play() 播放或者從當前位置繼續播放
  • pause() 暫停
  • stop() 停止結束播放
  • 對應狀態

  • QMediaPlayer::PlayingState
  • QMediaPlayer::PausedState
  • QMediaPlayer::StoppedState
  • 3.代碼

    源碼下載 https://download.csdn.net/download/qq_44084616/15744804

    #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QtMultimedia> #include <QVideoWidget> #include <QFileDialog> #include <QTimer> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_start_clicked();void on_finish_clicked();void on_url_clicked();void on_stateChanged(QMediaPlayer::State);void OnDurationChanged(qint64);void on_timeout();void on_TimeSlider_sliderPressed();void on_TimeSlider_sliderMoved(int position);void on_TimeSlider_sliderReleased();void on_pushButton_clicked();void on_horizontalSlider_sliderMoved(int position);void on_horizontalSlider_sliderReleased();private:Ui::MainWindow *ui;QVideoWidget* videoWidget;QMediaPlayer* mediaPlayer;QString sUrl;QTimer timer;bool isMute; }; #endif // MAINWINDOW_H #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);mediaPlayer = new QMediaPlayer; //播放媒體源videoWidget = new QVideoWidget; //用來顯示媒體對象制作的視頻 (播放器)mediaPlayer->setVideoOutput(videoWidget); //視頻輸出到媒體播放器ui->gridLayout_2->addWidget(videoWidget);videoWidget->setAutoFillBackground(true); //允許背景自動填充QPalette qplte;qplte.setColor(QPalette::Window, QColor(0,0,0));videoWidget->setPalette(qplte); //設置面板顏色ui->start->setEnabled(false); //初始禁用開始、停止按鈕ui->finish->setEnabled(false);ui->TimeSlider->setEnabled(false);isMute = false; //揚聲器未靜音connect(mediaPlayer,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(on_stateChanged(QMediaPlayer::State))); //播放狀態改變 開始/繼續:play() 暫停:pause() 結束:stop()connect(mediaPlayer, SIGNAL(durationChanged(qint64)), this, SLOT(OnDurationChanged(qint64))); //視頻持續時間,毫秒值 mediaPlayer->duration()可以直接獲取connect(&timer,&QTimer::timeout,this,&MainWindow::on_timeout); //定時器,用于獲取視頻當前播放時間,毫秒值 }MainWindow::~MainWindow() {delete ui; }/** 1. QT += core gui multimedia multimediawidgets* 2.**/void MainWindow::on_url_clicked() //選擇要播放視頻 {QString Url = QFileDialog::getOpenFileName(this,"打開視頻","*.mp4");if(!Url.isEmpty()){sUrl = Url;ui->start->setEnabled(true);ui->TimeSlider->setEnabled(false);ui->TimeSlider->setValue(0);} }void MainWindow::on_start_clicked() //開始按鈕點擊后設置相應的播放狀態和需要的文字 {if(ui->start->text() == "開始"){mediaPlayer->setMedia(QUrl::fromLocalFile(sUrl)); //設置當前媒體源。mediaPlayer->play();/** mediaPlayer->position() 當前播放時間,毫秒值* mediaPlayer->duration() 視頻總時長, 毫秒值* mediaPlayer->volume() 視頻的播放音量 默認值100* QDateTime::fromMSecsSinceEpoch(mediaPlayer->position()).toString("hh:mm:ss") 將毫秒值按指定格式轉換*/ui->showTime->setText(QDateTime::fromMSecsSinceEpoch(mediaPlayer->position()).toString("hh:mm:ss")+"/"+QDateTime::fromMSecsSinceEpoch(mediaPlayer->duration()).toString("hh:mm:ss"));ui->TimeSlider->setEnabled(true);ui->horizontalSlider->setValue(mediaPlayer->volume());}else if(ui->start->text() == "暫停"){mediaPlayer->pause();}else if(ui->start->text() == "繼續"){mediaPlayer->play();}}void MainWindow::on_finish_clicked() //停止播放 {mediaPlayer->stop();ui->TimeSlider->setValue(0);ui->start->setText("開始");ui->finish->setEnabled(false); }void MainWindow::on_stateChanged(QMediaPlayer::State state) //播放狀態發生變化 {switch (state) {case QMediaPlayer::StoppedState:ui->start->setText("開始");ui->finish->setEnabled(false);timer.stop();break;case QMediaPlayer::PausedState:mediaPlayer->pause();ui->start->setText("繼續");timer.stop();break;case QMediaPlayer::PlayingState:ui->start->setText("暫停");ui->finish->setEnabled(true);timer.start(10);break;} }void MainWindow::OnDurationChanged(qint64 range) {if(range > 0){ui->TimeSlider->setEnabled(true);ui->TimeSlider->setRange(0,range);} }void MainWindow::on_timeout() //更新播放時間軸和時間戳 {ui->showTime->setText(QTime::fromMSecsSinceStartOfDay(mediaPlayer->position()).toString("hh:mm:ss")+"/"+QTime::fromMSecsSinceStartOfDay(mediaPlayer->duration()).toString("hh:mm:ss"));ui->TimeSlider->setValue(mediaPlayer->position()); }void MainWindow::on_TimeSlider_sliderPressed() //時間軸: 按下鼠標左鍵 {timer.stop(); }void MainWindow::on_TimeSlider_sliderMoved(int position) // 時間軸:鼠標移動 {mediaPlayer->pause();mediaPlayer->setPosition(position); //跳轉到position 時間點位置 }void MainWindow::on_TimeSlider_sliderReleased() //時間軸: 鼠標離開 {mediaPlayer->play();timer.start(10); }void MainWindow::on_pushButton_clicked() //揚聲器按鈕,切換靜音和非靜音狀態 {if(!isMute){isMute = !isMute;ui->pushButton->setIcon(QIcon(":/img/mute.png"));mediaPlayer->setMuted(isMute);}else{isMute = !isMute;ui->pushButton->setIcon(QIcon(":/img/loudSpeaker.png"));mediaPlayer->setMuted(isMute);mediaPlayer->setVolume(ui->horizontalSlider->value()); //設置音量} }void MainWindow::on_horizontalSlider_sliderMoved(int position) //音量軸: 鼠標移動 {mediaPlayer->setVolume(position);if(position == 0){isMute = !isMute;mediaPlayer->setMuted(isMute);ui->pushButton->setIcon(QIcon(":/img/mute.png"));}else{isMute = !isMute;mediaPlayer->setMuted(isMute);ui->pushButton->setIcon(QIcon(":/img/loudSpeaker.png"));} }void MainWindow::on_horizontalSlider_sliderReleased() //音量軸: 鼠標離開 {mediaPlayer->setVolume(ui->horizontalSlider->value()); }

    4.截圖

    4.1初始界面

    4.2 暫停

    4.3 靜音

    4.4 拖進

    不好截圖,自己試試吧

    5. 注意

    如果加載視頻報錯,如:

    DirectShowPlayerService::doRender: Unresolved error code 0x80040266 ()

    出現這個報錯的原因:

  • 文件路徑不對或者文件名是中文的
  • 未安裝LAVFilters解碼器 下載鏈接:https://github.com/Nevcairiel/LAVFilters/releases
  • 總結

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

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