Qt的multimedia和multimediawidgets模块实现多媒体播放器

目录

Qt故事介绍

multimedia和multimediawidgets类

multimedia类的子类QMediaplayer

MP3播放案例

 MP4播放案例

视频播放器项目

 项目描述


Qt故事介绍

Qt提供了很多模块,比如multimedia、multimediawidgets、network、sql等,每一个模块都提供了很多功能和类。我理解的模块其实是一个大类,每一个大类包含许多子类(有些模块可能有单独的函数,我猜的)

Qt Creator版本自5.0开始就发生了很大的变化,(我是这么认为的)

比如Qt4的信号和槽机制是信号(SIGNAL)和槽函数(SLOT),而Qt5则弃用这种赤裸裸的表示,直接使用引用的方式来调用信号和槽函数;

又比如Qt4的widgets组件是包含在图形用户界面接口(gui)模块里面,Qt5则是将widgets从图形用户界面接口(gui)中脱离出来了,Qt5有很多改动,改动最大的就是信号和槽机制。

而Qt的信号和槽机制是Qt框架下一项最重要的最基本的功能之一,用于对象之间的数据通信,信号和槽是通过Qobject类来实现的,每一个Qobject类实例化的对象都可以自定义自己的信号和槽函数,然后通过connect函数连接起来,当一个信号被发出的时候,所有接收该信号的槽函数都会被立即执行(执行顺序则是由槽函数所在的connect函数来实现)。

因此Qt5和Qt4是Qt的版本分水岭。

Qt历史版本

* 1991年,Haavard Nord和Eirik Chambe-Eng开始开发将会支持X11和Windows的Qt

* 1994年,Qt Company成立

* 1996年,KDE项目由MatthiasEttrich创建(Matthias现为诺基亚Qt发展框架工作)

* 1998年4月5日,Trolltech的程序员在 5 天之内将 Netscape5.0 从Motif移植到 Qt 上

* 1998年4月8日,KDE Free Qt 基金会成立

* 1998年7月9日,Qt 1.40 发布

* 1998年7月12日,KDE 1.0 发布

* 1999年3月4日,QPL1.0 发布

* 1999年3月12日,Qt 1.44 发布

* 1999年6月25日,Qt 2.0 发布

* 1999年9月13日,KDE 1.1.2 发布

* 2000年3月20日,嵌入式Qt 发布

* 2000年9月6日,Qt 2.2 发布

* 2000年10月5日,Qt 2.2.1 发布

* 2000年10月30日,Qt/Embedded 开始使用GPL宣言

* 2000年9月4日,Qt free edition 开始使用 GPL

* 2008年,Nokia从Trolltech公司收购Qt,并增加LGPL的授权模式

* 2011年,Digia从Nokia收购了Qt的商业版权,从此Nokia负责Qt on Mobile,,Qt Commercial由Digia负责

* 根据最新消息,NOKIA已经停止Meltemi系统开发,Qt部门被解散

* 2012年8月9日,作为非核心资产剥离计划的一部分,诺基亚宣布将Qt软件业务出售给芬兰IT服务公司Digia。

* 2013年7月3日,Digia公司Qt开发团队在其官方博客上宣布Qt 5.1正式版发布。

* 2013年12月11日,Digia公司Qt开发团队宣布Qt 5.2正式版发布。

* 2014年4月,Digia公司Qt开发团队宣布Qt Creator 3.1.0正式版发布。

* 2014年5月20日,Digia公司Qt开发团队宣布Qt 5.3正式版发布。

* 2019年,Qt团队宣布最新版5.13版本发布。

故事介绍完毕,接下来介绍正事儿。

multimedia和multimediawidgets类

Qt通过QMultimedia模块提供多媒体功能。QMultimedia模块基于不同的平台抽象出多媒体接口来实现 平台相关的特性和硬件加速。这些多媒体接口功能覆盖了播放视频音频、录制视频音频的功能,包括支持多种多媒体封装格式,它还支持摄像头、耳机、麦克风等设备。

要想在Qt程序中支持多媒体功能,需要在. pro文件添加如下代码:

QT       += multimedia              //pro工程文件添加多媒体模块,该模块主要用来播放各种音频视频等文件

multimedia类提供了很多类,其中主要是如下13种类

 如果要在项目中使用视频播放功能(即使用QVideoWidget或QGraphicsVideoltem进行视频播放),那么还需要加入下面的一行代码:

QT       += multimedia multimediawidgets //该模块主要用来显示控制播放页面,比如播放页面大小等

 加上这两个模块,Qt的多媒体播放器就可以实现啦。

multimedia类的子类QMediaplayer

QMediaPlayer类可以通过调用setmedia() 函数设置播放单个文件,也可以通过调用setPlayList()函数 设置一个QMediaPlayList类的实例来表示的播放列表,对列表中的文件进行播放,并且自动播放下一个文件或循环播放等。QMediaPlayer类播放的文件可以是本地文件,也可以是网络上的媒体文件。

QMediaplayer类的成员函数

播放器的状态(信号)

[signal]

void QMediaPlayer::stateChanged(QMediaPlayer::State state)

在调用play()、pause()、stop()函数发出stateChanged,可以反映播放器当前状态,有以下三种值: 

 1、QMediaPlayer::StoppedState 0 媒体播放器没有播放内容,将从当前曲目的开始处开始播放

2、QMediaPlayer::PlayingState 1 媒体播放器当前正在播放内容

3、QMediaPlayer::PausedState 2 媒体播放器已暂停播放,当前曲目的播放将从播放器暂停的位置恢复

MP3播放案例

项目共五个文件,分别是pro工程文件、widget.h头文件和main.cpp主函数文件、widget.cpp源文件和widget.ui图形界面文件

 除了pro文件添加了两个模块:multimedia、multimediawidgets,还有widget.cpp文件有改动,其他都没用,因此这里只提供改动的文件。

multimedia.pro

#-------------------------------------------------
#
# Project created by QtCreator 2023-06-30T21:08:19
#
#-------------------------------------------------

QT       += core gui multimedia multimediawidgets 
#除了core模块之外还需要添加另外两个,ui可不添加

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = multimedia
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
        widget.cpp

HEADERS  += widget.h

FORMS    += widget.ui

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QMediaPlayer>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //1、创建QMediaPlayer对象
    QMediaPlayer *player = new QMediaPlayer(this);

    //2、设置要播放的资源文件中的媒体文件
    //player->setMedia(QUrl("qrc:/song/love.mp3"));
    //设置要播放本地的媒体文件
    player->setMedia(QUrl::fromLocalFile("D:\\study\\QtMultiMedia\\oldstreet.mp3"));

    //3、设置播放音量
    player->setVolume(50);

    //4、开始播放音乐
    player->play();
}

Widget::~Widget()
{
    delete ui;
}

效果(,,,,)

 MP4播放案例

项目共五个文件,分别是pro工程文件、widget.h头文件和main.cpp主函数文件、widget.cpp源文件和widget.ui图形界面文件

 除了pro文件添加了两个模块:multimedia、multimediawidgets,还有widget.cpp文件有改动,其他都没用,因此这里只提供改动的文件,ui文件只需要创建一个窗体即可。

 multimedia.pro文件代码参考上方,一模一样

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QMediaPlayer>
#include <QVideoWidget>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //1、创建QMediaPlayer对象
    QMediaPlayer *player = new QMediaPlayer(this);

    //2、播放本地视频(如果报错0x80040266需要安装视频解码器 百度就可以解决)

    player->setMedia(QUrl::fromLocalFile("D:\\study\\QtMultiMedia\\DemonChildComestoEarth.mp4"));
    QVideoWidget *videoWidget = new QVideoWidget(this);
    videoWidget->setFixedSize(this->width(),this->height());
    player->setVideoOutput(videoWidget);
    //播放音乐
    player->play();
}

Widget::~Widget()
{
    delete ui;
}

需要注意的是视频播放是需要解码的,如果出现不能播放的情况,下载一个视频解码器

这里提供了一个下载地址,仅供参考

LAV Filters中文版_LAV Filters中文版下载[解码器]-下载之家LAV Filters中文版是一款非常不错的视频解码工具。LAV Filters中文版是一组基于 ffmpeg 项目中的 libavformat/libavcodec 库的 directshow 分离器和音视频解码器,几乎允许您在 directshow 播放器中播放任何格式的媒体文件!http://www.downza.cn/soft/253007.html播放效果:

视频播放器项目

该项目共五个文件,分别是pro工程文件、widget.h头文件和main.cpp主函数文件、widget.cpp源文件和widget.ui图形界面文件

 除了pro文件添加了两个模块:multimedia、multimediawidgets,还有widget.cpp、widget.h文件有改动,ui文件改动,其他都没用,因此这里只提供改动的文件。

 multimedia.pro文件代码参考上方multimedia.pro,一模一样

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMediaPlayer>
#include <QVideoWidget>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    //定义四个按钮的槽函数,分别实现加载、播放、暂停和停止播放的功能
    void on_loadVideoBtn_clicked();

    void on_playBtn_clicked();

    void on_pauseBtn_clicked();

    void on_stopBtn_clicked();

private:
    Ui::Widget *ui;
    QMediaPlayer *player;
    QVideoWidget *videoWidget;
    QString currFile;
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDir>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QMessageBox>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setWindowTitle("视频播放器");
    setFixedSize(612,384);
    //1、创建QMediaPlayer、QvideoWidget对象
    player = new QMediaPlayer(this);
    videoWidget = new QVideoWidget(this);
    videoWidget->setFixedSize(441,210);//固定窗口大小的方式一
    videoWidget->move(80,70);
    //创建一个QVBoxLayout的对象,设置播放窗口的方式二
    //QVBoxLayout *layout=new QVBoxLayout;
    //layout->addWidget(videoWidget);
    //setLayout(layout);

     ui->playBtn->setText("播放");
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_loadVideoBtn_clicked()
{
    QString currPath=QDir::homePath();//获取当前系统目录
    QString dialogSelectFile="选择视频文件";
    QString filter="wmv文件(*.wmv);;mp4文件(*.mp4);;所有文件(*.*)";
    QString File=QFileDialog::getOpenFileName(this,dialogSelectFile,currPath,filter);
    if(File.isEmpty())
    {
        return;
    }
    ui->label->setText(File);//显示载入的视频路径
    currFile=File;
    player->setVideoOutput(videoWidget);
    player->setMedia(QUrl::fromLocalFile(File));

}

void Widget::on_playBtn_clicked()
{
    ui->playBtn->setText("重新播放");
    if(currFile.isEmpty())
    {
        QMessageBox::information(this,"error","open file failed");
        qDebug()<<"could not open file"<<endl;
        return;
    }
    QFile file(currFile);
    if(!file.open(QIODevice::ReadOnly))
    {
         QMessageBox::information(this,"error","open file failed");
         qDebug()<<"could not open file"<<endl;
         return;
    }
    player->setVideoOutput(videoWidget);
    player->setMedia(QUrl::fromLocalFile(currFile));
    player->play();

}

void Widget::on_pauseBtn_clicked()
{
    if(player->state()==QMediaPlayer::PausedState)
    {
        player->setPosition(player->position());
        player->play();
        ui->pauseBtn->setText("暂停");
    }
    else if(player->state()==QMediaPlayer::PlayingState)
    {
        player->pause();
        ui->pauseBtn->setText("播放");
    }
}

void Widget::on_stopBtn_clicked()
{
    player->stop();
}

widget.ui

ui文件的对象的命名和所属类

 

 效果图

 项目描述

        不管是音乐播放还是视频播放,都可以通过Qt提供的multimedia模块来开发一款你所喜欢的播放器。我这里简单的做了一个播放器,实现加载视频,播放、暂停和停止播放功能,通过实例化QMediaPlayer类并创建一个该类的指针,用来访问该类的成员,然后实例化QVideoWidget类并创建一个该类的指针来访问该类成员,用QString的实例化对象来获取视频文件,将获取到的视频文件通过QMediaPlayer的成员函数setVideoOutput来显示播放,通过setMedia函数获取播放源,最后调用play函数来播放,暂停功能则通过state函数来进行判断,如果PauseState,表明是暂停状态,如果是PlayingState,则是正在播放状态,停止功能则是调用stop函数。

  • 10
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值