基于QMediaPlayer的简易视频播放器
- 1、创建基本布局
- 2、QMediaPlayer的基本使用
- 3、结合QSlider实现播放进度控制
- 4、重载QSlider鼠标响应事件,实现单击跳转至任意位置
2、QMediaPlayer的基本使用
这里不对QMediaPlayer类进行详细介绍,可以参考 [ 官方文档 ] 或 [ zwlq1314521的专栏 ]
首先打开Qt的工程文件*.pro,向其中添加引用项:
QT += core gui \
multimedia \
multimediawidgets
点击 构建-执行qmake,或者在项目窗口中右击执行qmake,使.pro文件配置生效
在mediaplayer.cpp中添加头文件,并定义全局变量
#include <QMediaPlayer>
#include <QVBoxLayout>
#include <QVideoWidget>
#include <QFileDialog>
#include <QFile>
#include <QMessageBox>
//播放视频的全局变量
QVBoxLayout* layout_video;//布局
QMediaPlayer* player; //播放器
QVideoWidget* widget; //视频播放控件
//播放状态,true为播放,false为暂停
bool play_state;
//是否重新载入视频
bool if_reload=false;
在载入ui时,先禁用播放/暂停按钮和音量按钮:
MediaPlayer::MediaPlayer(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MediaPlayer)
{
ui->setupUi(this);
ui->pushButton_play_and_pause->setEnabled(false);
ui->pushButton_volume->setEnabled(false);
}
在Designer中右击“打开”pushButton控件,“转到槽”->”clicked()”->”ok”
槽函数如下:
void MediaPlayer::on_pushButton_open_file_clicked()
{
//选择视频文件
QString filename = QFileDialog::getOpenFileName(this,tr("选择视频文件"),".",tr("视频格式(*.avi *.mp4 *.flv *.mkv)"));
QFile file(filename);
if(!file.open(QIODevice::ReadOnly))
{
QMessageBox::information(NULL, "Title", "Content", QMessageBox::Ok, QMessageBox::Ok);
return;
}
if(if_reload)
{//重新加载视频时,重置以下变量
delete layout_video;
delete player;
delete widget;
delete timer;
}
if_reload = true;
//实例化三个全局变量
layout_video = new QVBoxLayout;
player = new QMediaPlayer;
widget = new QVideoWidget;
//设置视频播放区域与Label的边距
layout_video->setMargin(1);
//根据label_player尺寸设置播放区域
widget->resize(ui->label_player->size());
layout_video->addWidget(widget);
ui->label_player->setLayout(layout_video);
player->setVideoOutput(widget);
//设置播放器
player->setMedia(QUrl::fromLocalFile(filename));
//play_state为true表示播放,false表示暂停
play_state = true;
//启用播放/暂停按钮,并将其文本设置为“暂停”
ui->pushButton_play_and_pause->setEnabled(true);
ui->pushButton_play_and_pause->setText("暂停");
//播放器开启
player->play();
}
到这一步,就已经可以播放视频了。接下来我们添加“播放/暂停”按钮的槽函数:
void MediaPlayer::on_pushButton_play_and_pause_clicked()
{
//反转播放状态
if(play_state)
{
player->pause();
ui->pushButton_play_and_pause->setText("播放");
}
else
{
player->play();
ui->pushButton_play_and_pause->setText("暂停");
}
play_state = !play_state;
}
好了,打开测试一下:
如果播放时出现只有声音而没有画面的情况,那就是解码器的问题。在写这个程序时找了久的原因,最后在这篇博文里找到了解决方案: [ CN小黑 极客人生] 推荐安装K-Lite解码器。
至此,基于QMediaPlayer的核心播放功能已经编写完成,接下来我们通过QSlider对播放进度和音量进行控制。