《二十三》Qt 简单小项目---视频播放器

QT 使用QMediaPlayer实现的简易视频播放器

效果如下:

功能点
  1. 播放指定视频
  2. 点击屏幕暂停/播放
  3. 开始/暂停/重置视频
  4. 拖拽到指定位置播放

类介绍

  •     需要在配置文件中加入Multimedia, MultimediaWidgets这俩个库。
  •     Multimedia:提供了一套用于处理音频、视频、摄像头和广播数据的API。
  •     MultimediaWidgets:提供了一些与多媒体相关的图形界面组件。
  •     QVideoProbe是Qt多媒体模块中的一个类,它用于监控视频流的输出。这个类允许你接收视频帧的数据,而不需要直接与视频输出设备交互。
  •     QMediaPlayer 使用生产者-消费者模型来处理媒体内容。它从媒体源(如文件或网络流)获取数据,然后通过播放控制接口(如播放、暂停、停止)和播放状态接口(如当前播放位置、总时长)来控制媒体内容的播放。
  •     使用 QMediaPlayer时,通常需要将其与一个或多个媒体输出组件结合使用,例如QVideoWidget用于视频播放,QAudioOutput用于音频播放。

注意:在Qt6中使用QMediaPlayer时,使用的是setSource函数设置视频资源,而Qt5中并没有这个函数,使用的是setMedia函数。而且有个非常坑的地方,Qt6设置完QVideoWidget直接使用没有问题,而Qt5就会存在问题。 

 信息栏会报错:

DirectShowPlayerService::doRender: Unresolved error code 0x80040266 

在window上需安装LAV解码器的,并放在Qt的安装目录下
在Linux上个人验证并不需要安装

解决办法:QT无法播放视频:报错:DirectShowPlayerService::doRender: Unresolved error code 0x80040266-CSDN博客

代码介绍

我们需要在pro文件中先添加:

 随后我们添加一个C++类,基类选择QVideoWidget,来定义一些鼠标和键盘事件:

qmyselfvideo.h
#include<QVideoWidget>
#include<QObject>
#include<QWidget>
#include<QMediaPlayer>

#include<QKeyEvent>
#include<QMouseEvent>

class QMySelfVideo : public QVideoWidget
{
public:
    QMySelfVideo(QWidget *parent=nullptr);

    void SetMediaPlayer(QMediaPlayer *player);

private:
    QMediaPlayer  *theplayer;

protected:
    void keyPressEvent(QKeyEvent *event);//键盘按键事件,当按键按下esc退出全屏
    void mousePressEvent(QMouseEvent *event);//鼠标按键时间,点击暂停和播放
};

qmyselfvideo.cpp

#include "qmyselfvideo.h"

QMySelfVideo::QMySelfVideo(QWidget *parent):QVideoWidget(parent)
{

}

void QMySelfVideo::SetMediaPlayer(QMediaPlayer *player)
{
    //设置播放器操作
    theplayer=player;
}

void QMySelfVideo::keyPressEvent(QKeyEvent *event)//当播放器为全屏的时候,我们按下esc就可以退出全屏
{
    if((event->key()==Qt::Key_Escape)&&(isFullScreen())){
        setFullScreen(false);
        event->accept();
        QVideoWidget::keyPressEvent(event);
    }
}

void QMySelfVideo::mousePressEvent(QMouseEvent *event)//按下左键设置播放和暂停
{
    if(event->button()==Qt::LeftButton){
        if(theplayer->state()==QMediaPlayer::PlayingState){
            theplayer->pause();
        }else{
            theplayer->play();
        }
    }
    QVideoWidget::mousePressEvent(event);
}

 注意:我们要对graphicsView进行提升,提升的类名就是我们刚刚创建的C++类名,因为它的基类就是QVideoWidget。

 代码初始化定义:

#include <QMainWindow>
#include"qmyselfvideo.h"
#include<QMediaPlayer>
#include<QMediaPlaylist>
#include<QVideoWidget>
#include<QFileDialog>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    QMediaPlayer *player;//播放器
    QString drtTime;//视频文件长度
    QString posTime;//播放视频的当前位置

private slots:
    void OnStateButtonChanged(QMediaPlayer::State state);//控制按钮状态
    void OndrtTimeChanged(qint64 drt);//视频文件时间长度,更新变化
    void OnposTimeChanged(qint64 pos);//播放视频当前位置时间更新变化
}

 定义我们所需要的量,以及一些我们需要的槽函数来处理一些变化。

代码功能分析:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    player=new QMediaPlayer(this);
    player->setNotifyInterval(1000);
    player->setVideoOutput(ui->graphicsView);//视频显示组件

    ui->graphicsView->SetMediaPlayer(player);//设置显示组件的关联播放器
}

初始化,没什么好说的。

根据state的状态,来更新播放,暂停,停止按钮的状态:

void MainWindow::OnStateButtonChanged(QMediaPlayer::State state)
{
    ui->pushButton_play->setEnabled(!(state==QMediaPlayer::PlayingState));
    ui->pushButton_pause->setEnabled(state==QMediaPlayer::PlayingState);
    ui->pushButton_stop->setEnabled(state==QMediaPlayer::PlayingState);
}

根据视频的长度来显示时长,格式:已经播放的时长/总时长。时间是:分:秒。将设置好的时长显示在我们添加的label中显示

void MainWindow::OndrtTimeChanged(qint64 drt)
{
    ui->horizontalSlide_speedr->setMaximum(drt);

    int sec=drt/1000;//总时长
    int min=sec/60;//分
    sec=sec%60;//秒

    drtTime=QString::asprintf("%d:%d",min,sec);
    ui->label_speed->setText(posTime+"|"+drtTime);
}

void MainWindow::OnposTimeChanged(qint64 pos)
{
    if(ui->horizontalSlide_speedr->isSliderDown()){
        return;//如果正在拖动滑动条,则直接退出
    }
    ui->horizontalSlide_speedr->setSliderPosition(pos);

    int sec=pos/1000;
    int min=sec/60;
    sec=sec%60;

    posTime=QString::asprintf("%d:%d",min,sec);
    ui->label_speed->setText(posTime+"|"+drtTime);
}

槽函数链接:

connect(player,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(OnStateButtonChanged(QMediaPlayer::State)));
    connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(OnposTimeChanged(qint64)));
    connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(OndrtTimeChanged(qint64)));

根据状态改变来连接相应的槽函数 。

按钮滑动条槽函数 :

    void on_pushButton_open_clicked();//打开文件
    void on_pushButton_play_clicked();//播放
    void on_pushButton_pause_clicked();//暂停
    void on_pushButton_stop_clicked();//停止
    void on_pushButton_Volumn_clicked();//声音
    void on_horizontalSlider_Volumn_valueChanged(int value);//声音滑动条
    void on_horizontalSlide_speedr_valueChanged(int value);//进度条

对于open:

void MainWindow::on_pushButton_open_clicked()
{
    QString currentpath=QDir::homePath();//获得系统当前目录
    QString dlgtitle="请选择视频文件";
    QString filter="所有文件(*.*);;mp4文件(*.mp4)";//文件过滤器
    QString strfile=QFileDialog::getOpenFileName(this,dlgtitle,currentpath,filter);

    if(strfile.isEmpty()){
        return;
    }
    QFileInfo fileinfo(strfile);
    ui->label_name->setText(fileinfo.fileName());
    player->setMedia(QUrl::fromLocalFile(strfile));//设置播放文件
    player->play();
}

我们首先获取文件的位置路径,在设置文件过滤器来获取我们所需要的MP4文件格式,最后设置播放文件进行播放。

其他开始,暂停等一些按钮槽函数:

void MainWindow::on_pushButton_play_clicked()
{
    player->play();
}

void MainWindow::on_pushButton_pause_clicked()
{
    player->pause();
}

void MainWindow::on_pushButton_stop_clicked()
{
    player->stop();
}

void MainWindow::on_pushButton_Volumn_clicked()
{
    bool bmute=player->isMuted();
    player->setMuted(!bmute);
    //根据是否静音来显示音量图标
    if(bmute){
        ui->pushButton_Volumn->setIcon(QIcon(":/icon/sound.png"));
    }else{
        ui->pushButton_Volumn->setIcon(QIcon(":/icon/mute.png"));
    }
}

void MainWindow::on_horizontalSlider_Volumn_valueChanged(int value)
{
    player->setVolume(value);
}

void MainWindow::on_horizontalSlide_speedr_valueChanged(int value)
{
    player->setPosition(value);
}

总结:

只是一个简单视频播放器,博主能力有限还在学习当中。大家可自行尝试修改改进。

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Qt 是一个跨平台的应用程序开发框架,能够帮助开发者快速地创建各种类型的应用程序。其中,Qt 视频播放器Qt 框架中的一个重要功能,用于播放各种视频格式的文件。 CSDN 是一个面向程序员的技术社区,提供了丰富的技术资源和交流平台。在 CSDN 上,我们可以找到很多关于 Qt 视频播放器的教程和资料。 Qt 视频播放器通过 Qt 多媒体模块实现视频播放的功能。开发者可以利用 Qt 的多媒体类库,如 QMediaPlayer 和 QVideoWidget,实现视频的播放、暂停、停止、快进、快退等功能。同时,Qt 还提供了对常见视频格式的支持,如 MP4、AVI 等,使开发者可以方便地处理不同格式的视频文件。 在 CSDN 上,我们可以找到很多关于 Qt 视频播放器的教程和示例代码。这些教程和示例代码可以帮助开发者了解 Qt 视频播放器的基本使用方法,学习如何自定义视频播放器的外观和功能,以及如何处理视频播放过程中的各种事件。 通过在 CSDN 上学习和交流,我们可以更好地掌握 Qt 视频播放器开发技术,解决遇到的问题,提高开发效率。同时,CSDN 社区也提供了一个交流平台,我们可以在其中与其他开发者分享经验、交流技术,共同推动 Qt 视频播放器的发展。 综上所述,Qt 视频播放器是通过 Qt 框架实现的功能,用于播放各种视频格式的文件。而 CSDN 则为开发者提供了学习、交流和分享的平台,可以帮助我们更好地学习和使用 Qt 视频播放器。 ### 回答2: QT视频播放器CSDN是一个基于QT开发视频播放器,可以用来播放各种视频文件格式。CSDN是一个开发者社区,提供了各种技术文章和资源,而QT是一款跨平台的GUI开发框架。结合使用这两个工具,可以开发出功能强大的视频播放器QT视频播放器CSDN具有多种功能,包括播放、暂停、快进、快退、调整音量等等。用户可以通过QT提供的UI界面进行操作,也可以通过设置快捷键来进行控制。播放器还支持播放列表功能,可以一次性导入多个视频文件进行连续播放。 开发者可以借助CSDN网站上的各种技术文章和资源,学习和掌握QT开发视频播放器的知识和技巧。CSDN上有很多关于QT的教程和案例,可以帮助开发者了解QT的基本使用方法,并实现各种高级功能。同时,CSDN还提供了丰富的开源项目开发者可以参考这些项目的源代码,加快开发进程。 在使用过程中,有可能会遇到一些问题。此时,可以在CSDN上提问,寻求其他开发者的帮助和建议。CSDN拥有一个庞大的开发者社区,很多问题都能得到及时解答。通过与其他开发者的交流和分享,可以进一步提升自己的开发水平。 总之,QT视频播放器CSDN是一个非常有用的工具,在开发视频播放器时可以充分利用其中的资源和技术支持,帮助开发者更加高效地完成项目。 ### 回答3: Qt视频播放器是一款基于Qt框架开发的多媒体播放器,它提供了丰富的功能和友好的界面,使得用户可以便捷地播放各种格式的视频文件。 Qt作为一个跨平台的开发框架,可以在各种操作系统上运行,因此Qt视频播放器具备了较好的兼容性。它支持在Windows、macOS和Linux等操作系统上进行编译和部署,让用户能够在不同平台上享受到同样稳定可靠的视频播放体验。 Qt视频播放器拥有清晰的界面和丰富的功能,可以实现基本的视频播放功能,如播放、暂停、快进、快退和音量调节等。此外,它还支持播放列表功能,用户可以将多个视频文件添加到播放列表中,方便地切换不同的视频文件进行观看。 Qt视频播放器也支持对视频的截图操作,用户可以通过简单的操作将正在播放的视频截取下来保存为图片格式。这对于用户来说非常方便,可以用于制作视频封面、保存有趣的场景或做其他用途。 除了基本的视频播放功能外,Qt视频播放器还支持视频格式的转换和编解码功能。用户可以使用该播放器将一个视频文件转换为另一种视频格式,并可以对视频进行编解码的设置,以获得更好的播放效果。 综上所述,Qt视频播放器是一款功能丰富、界面友好并具有较好兼容性的视频播放器。无论是在个人使用还是在开发商用途上,它都能提供稳定、流畅的视频播放体验,深受用户的喜爱。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值