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

编程入门 行业动态 更新时间:2024-10-12 05:44:16

Qt的multimedia和multimediawidgets<a href=https://www.elefans.com/category/jswz/34/1771428.html style=模块实现多媒体播放器"/>

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 += widgetsTARGET = 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.0SOURCES += main.cpp\widget.cppHEADERS  += widget.hFORMS    += 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 播放器中播放任何格式的媒体文件!.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_OBJECTpublic: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函数。

更多推荐

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

本文发布于:2024-03-13 22:45:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1735047.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模块   多媒体播放器   Qt   multimedia   multimediawidgets

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!