一、前言
学完qt好几个月了,一直没做相关的项目巩固,这次分享10个qt相关的小项目来练练手。
基于qt的MP4视频播放器:
- 所使用的技术为qt自带的视频库
- ui设计为qt图形化设计
- IDE为qtcreator
二、 视频库播放的前置知识
头文件主要有这几个:
代码语言:javascript复制#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QVideoWidget>
#include <QGraphicsVideoItem>
#include <QFileDialog>
#include <QGraphicsScene>
- QMediaPlayer:用于播放音频和视频的主要类。可以使用它来控制媒体的播放、暂停、停止等操作。
- QMediaPlaylist:用于管理媒体播放列表。可以向播放列表中添加多个媒体文件,并控制播放顺序、循环播放等。
- QVideoWidget:用于显示视频的小部件。可以将QVideoWidget添加到您的应用程序窗口中,以显示正在播放的视频。
- QGraphicsVideoItem:这个类是用于在Qt图形场景中显示视频的项。它可以与QGraphicsView和QGraphicsScene一起使用,以实现更灵活的视频显示和交互。
- QFileDialog:这个类用于显示文件选择对话框,以便用户选择要播放的媒体文件。
- QGraphicsScene:这个类是Qt图形场景的基类,用于管理和显示2D图形项。您可以使用QGraphicsScene来显示视频或其他图形项。
如果添加显示无法找到库,在pro文件中加上:
三、 ui设计
ui界面如下图所示:
四、函数编写
4.1 打开文件
代码语言:javascript复制void MainWindow::on_openButton_clicked()
{
QString strCurrentPath = QDir::homePath(); //获取系统当前目录
QString strDlgTitle = "选择视频文件";
QString strFilter = "MP4 File(*.mp4);;All File(*.*)";// 打开视频文件过滤
QString strAllFiles = QFileDialog::getOpenFileName(this,strDlgTitle,strCurrentPath,strFilter);
if(strAllFiles.isEmpty())
{
QMessageBox::information(this,"错误","打开视频文件失败,请重新检查",QMessageBox::Yes|QMessageBox::No);
return;
}
QFileInfo fileInfos(strAllFiles); // 获取文件信息
ui->label_2->setText(fileInfos.fileName());
player->setMedia(QUrl::fromLocalFile(strAllFiles));
player->play();
}
4.2 播放
代码语言:javascript复制void MainWindow::on_playButton_clicked()
{
player->play();
}
4.3 暂停
代码语言:javascript复制void MainWindow::on_pauseButton_clicked()
{
player->pause();
}
4.4 停止
代码语言:javascript复制void MainWindow::on_stopButton_clicked()
{
player->stop();
}
4.5 控制音量
代码语言:javascript复制void MainWindow::on_pushButton_Sound_clicked()
{
bool mte=player->isMuted();
player->setMuted(!mte);
if(mte)
ui->pushButton_Sound->setIcon(QIcon(":/new/prefix1/images/volumn.bmp"));
else
ui->pushButton_Sound->setIcon(QIcon(":/new/prefix1/images/mute.bmp"));;
}
4.6 播放时间
代码语言:javascript复制void MainWindow::onDurationChanged(qint64 duration)
{
ui->horizontalSlider_Position->setMaximum(duration);
int secs=duration/1000;//秒
int mins=secs/60; //分钟
secs=secs % 60;//余数秒
durationTime=QString::asprintf("%d:%d",mins,secs);
ui->label_Ratio->setText(positionTime "/" durationTime);
}
void VideoPlayer::onPositionChanged(qint64 position)
{
if (ui->horizontalSlider_Position->isSliderDown())
return;
ui->horizontalSlider_Position->setSliderPosition(position);//
int secs=position/1000;//秒
int mins=secs/60; //分钟
secs=secs % 60;//余数秒
positionTime=QString::asprintf("%d:%d",mins,secs);
ui->label_Ratio->setText(positionTime "/" durationTime);
}
最后
如果本文对你有所帮助,还请三连支持一下博主!