您的位置:首页 > 房产 > 家装 > QT多媒体编程(二)——视频编程知识详解及mp4视频播放器Demo

QT多媒体编程(二)——视频编程知识详解及mp4视频播放器Demo

2024/12/21 20:31:09 来源:https://blog.csdn.net/weixin_62621696/article/details/140872348  浏览:    关键词:QT多媒体编程(二)——视频编程知识详解及mp4视频播放器Demo

目录

引言

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();elsetheplayer->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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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"));}elseui->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多媒体编程中的视频编程功能强大且灵活,通过QMediaPlayerQVideoWidget等核心类,开发者可以轻松实现视频的播放、暂停、停止以及显示等功能。本文深入解析了这些核心类的使用方法和相关函数的调用,并通过实际案例展示了如何在QT应用程序中集成视频功能。希望这篇文章能够帮助到正在学习QT多媒体编程的开发者们。

传送门:QT多媒体编程(一)——音频编程知识详解及MP3音频播放器Demo

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com