目录
引言
1. QMediaPlayer 类详解
1.1 基本用法
示例代码:
1.2 常用函数
2. QVideoWidget 类详解
2.1 基本用法
示例代码:
2.2 常用函数
3. 实际案例:视频播放器
UI界面
核心代码:
运行结果:
4. 总结
引言
在上一篇文章中,我们初步探索了QT多媒体框架的基础知识与音频处理的能力。今天,我们将深入QT的多媒体世界,专注于视频编程的奥秘。本文将深入解析QT多媒体编程中视频编程的核心知识,并通过实际案例展示如何使用QT多媒体库进行视频编程实现mp4视频播放器Demo。
1. QMediaPlayer 类详解
QMediaPlayer
是QT多媒体框架中的一个核心组件,它专门用于播放音频和视频文件。该类使用跨平台的QT音频和视频后端,支持多种音频和视频格式,如MP3、WAV、OGG、AAC(音频格式)以及MPEG、AVI(视频格式)等。
1.1 基本用法
使用QMediaPlayer
前,首先需要在Qt项目中包含相应的模块。在.pro
文件中添加QT += multimedia
以确保多媒体模块的可用性。
示例代码:
#include <QApplication>
#include <QMediaPlayer>
#include <QDebug>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QMediaPlayer *player = new QMediaPlayer;
player->setMedia(QUrl::fromLocalFile("path/to/your/video/file"));
player->setVolume(50); // 设置音量为50%
player->play(); // 开始播放
// 监听播放结束事件
connect(player, &QMediaPlayer::stateChanged, [=](QMediaPlayer::State state) {
if (state == QMediaPlayer::StoppedState) {
qDebug() << "Video playback finished!";
}
});
return a.exec();
}
1.2 常用函数
setMedia(const QMediaContent &media)
: 设置要播放的媒体内容。play()
: 开始播放媒体。pause()
: 暂停播放。stop()
: 停止播放。setVolume(int volume)
: 设置音量,volume
参数范围为0到100。volume()
: 获取当前音量。stateChanged(QMediaPlayer::State state)
: 播放状态改变信号,用于监听播放状态的变化。
2. QVideoWidget 类详解
QVideoWidget
是QT框架中用于显示视频的组件。它可以嵌入到任何QWidget布局中,并与QMediaPlayer
结合使用,以在自定义界面中显示视频内容。
2.1 基本用法
QVideoWidget
的使用非常简单,首先创建其实例,然后将其与QMediaPlayer
关联即可。在.pro
文件中添加QT += multimediawidgets
以确保多媒体模块的可用性。
示例代码:
#include <QApplication>
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QVBoxLayout>
#include <QWidget>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QMediaPlayer *player = new QMediaPlayer;
QVideoWidget *videoWidget = new QVideoWidget;
player->setVideoOutput(videoWidget); // 将视频输出到videoWidget
player->setMedia(QUrl::fromLocalFile("path/to/your/video/file"));
layout->addWidget(videoWidget);
window.show();
player->play();
return a.exec();
}
2.2 常用函数
setAspectRatioMode(Qt::AspectRatioMode mode)
: 设置视频的宽高比模式,如Qt::IgnoreAspectRatio
(忽略宽高比)、Qt::KeepAspectRatio
(保持宽高比)等。setBrightness(int brightness)
: 设置视频的亮度。setContrast(int contrast)
: 设置视频的对比度。setHue(int hue)
: 设置视频的色调。setSaturation(int saturation)
: 设置视频的饱和度。
通过本文的介绍,相信读者已经对QT多媒体编程中的视频编程有了更深入的了解。无论是使用QMediaPlayer
进行视频播放,还是使用QVideoWidget
进行视频显示,QT都提供了丰富的API和强大的功能支持。希望本文能对正在从事QT多媒体开发的开发者们有所帮助。
3. 实际案例:视频播放器
UI界面
核心代码:
自定义控件实现鼠标单击暂停、播放还有按ESC键退出全屏。
QMyselfVideoWidget.h
#ifndef QMYSELFVIDEOWIDGET_H
#define QMYSELFVIDEOWIDGET_H
#include <QWidget>
#include <QObject>
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QKeyEvent>
#include <QMouseEvent>
class QMyselfVideoWidget : public QVideoWidget
{
public:
QMyselfVideoWidget(QWidget *parent = Q_NULLPTR);
void setMediaPlayer(QMediaPlayer *player);
private:
QMediaPlayer *theplayer;
protected:
void keyPressEvent(QKeyEvent *event); // 键盘按键事件,用户按ESC键退出全屏状态
void mousePressEvent(QMouseEvent *event);// 鼠标按键事件,当用户单击屏幕暂停、继续
};
#endif // QMYSELFVIDEOWIDGET_H
QMyselfVideoWidget .cpp
#include "qmyselfvideowidget.h"
QMyselfVideoWidget::QMyselfVideoWidget(QWidget *parent):QVideoWidget(parent)
{
}
void QMyselfVideoWidget::setMediaPlayer(QMediaPlayer *player)
{
// 设置播放器操作
theplayer=player;
}
void QMyselfVideoWidget::keyPressEvent(QKeyEvent *event) // 键盘按键事件,用户按ESC键退出全屏状态
{
if((event->key()==Qt::Key_Escape) && (isFullScreen()))
{
setFullScreen(false);
event->accept();
QVideoWidget::keyPressEvent(event);
}
}
void QMyselfVideoWidget::mousePressEvent(QMouseEvent *event)// 鼠标按键事件,当用户单击屏幕暂停、继续
{
if(event->button()==Qt::LeftButton)
{
if(theplayer->state()==QMediaPlayer::PlayingState)
theplayer->pause();
else
theplayer->play();
}
QVideoWidget::mousePressEvent(event);
}
QMainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "qmyselfvideowidget.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 pstTime; // 当前播放位置
private slots:
void onstatechanged(QMediaPlayer::State state); // 按钮切换状态
void ondrtchanged(qint64 drt); // 歌曲总时长
void onpstchanged(qint64 pos); // 播放歌曲当前位置
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_horizontalSlider_speed_valueChanged(int value);
};
#endif // MAINWINDOW_H
QMainWindow.cpp
#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); // 设置显示组件的关联播放器
connect(player, SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(onstatechanged(QMediaPlayer::State)));
connect(player, SIGNAL(positionChanged(qint64)),this,SLOT(onpstchanged(qint64)));
connect(player, SIGNAL(durationChanged(qint64)),this,SLOT(ondrtchanged(qint64)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::onstatechanged(QMediaPlayer::State state) // 按钮切换状态
{
ui->pushButton_play->setEnabled(!(state==QMediaPlayer::PlayingState));
ui->pushButton_pause->setEnabled(state==QMediaPlayer::PlayingState);
ui->pushButton_stop->setEnabled(state==QMediaPlayer::PlayingState);
}
void MainWindow::ondrtchanged(qint64 drt) // 歌曲总时长
{
ui->horizontalSlider_speed->setMaximum(drt);
int sec = drt/1000; //总秒
int min = sec/60; //总分
int hour = min/60;//总小时
min = min%60; // 余分
sec = sec%60; //余秒
drtTime = QString::asprintf("%02d:%02d:%02d",hour,min,sec);
ui->label_time->setText(drtTime);
}
void MainWindow::onpstchanged(qint64 pos) // 播放歌曲当前位置
{
if(ui->horizontalSlider_speed->isSliderDown())
return;
ui->horizontalSlider_speed->setSliderPosition(pos);
int sec = pos/1000; //总秒
int min = sec/60; //总分
int hour = min/60;//总小时
min = min%60; // 余分
sec = sec%60; //余秒
pstTime = QString::asprintf("%02d:%02d:%02d",hour,min,sec);
ui->label_speed->setText(pstTime);
}
void MainWindow::on_pushButton_open_clicked()
{
QString currentpath = QDir::homePath(); // 获取系统当前目录
QString dlgtitle = "请选择视频文件";
QString strfilter = "所有文件(*.*);;mp4文件(*.mp4)"; // 文件过滤器
QString strfile = QFileDialog::getOpenFileName(this,dlgtitle,currentpath,strfilter);
if(strfile.isEmpty())
return;
QFileInfo fileinfo(strfile);
ui->label_name->setText("正在播放:"+fileinfo.fileName());
player->setMedia(QUrl::fromLocalFile(strfile));
player->play();
}
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 mutex = player->isMuted();
player->setMuted(!mutex);
if(mutex)
{
ui->pushButton_volumn->setIcon(QIcon(":/images/1.PNG"));
}
else
ui->pushButton_volumn->setIcon(QIcon(":/images/2.PNG"));
}
void MainWindow::on_horizontalSlider_volumn_valueChanged(int value)
{
player->setVolume(value);
}
void MainWindow::on_horizontalSlider_speed_valueChanged(int value)
{
player->setPosition(value);
}
运行结果:
全屏功能还未实现!
4. 总结
QT多媒体编程中的视频编程功能强大且灵活,通过QMediaPlayer
、QVideoWidget
等核心类,开发者可以轻松实现视频的播放、暂停、停止以及显示等功能。本文深入解析了这些核心类的使用方法和相关函数的调用,并通过实际案例展示了如何在QT应用程序中集成视频功能。希望这篇文章能够帮助到正在学习QT多媒体编程的开发者们。
传送门:QT多媒体编程(一)——音频编程知识详解及MP3音频播放器Demo