#include "videplayer.h"
#include "ui_videplayer.h"
#include <QDebug>
#include <QFile>
VidePlayer::VidePlayer(QWidget *parent)
: QMainWindow(parent), ui(new Ui::VidePlayer), isSliderPressed(false)
{
ui->setupUi(this);
// 创建播放器对象
player = new QMediaPlayer(this);
// 音频输出
audioOutput = new QAudioOutput(this);
player->setAudioOutput(audioOutput);
// 视频窗口
videoWidget = new QVideoWidget(this);
// UI 的 widget_video 创建一个布局
QVBoxLayout* layout = new QVBoxLayout(ui->widget_video);
layout->setContentsMargins(0,0,0,0);
// 布局中添加视频窗口
layout->addWidget(videoWidget);
// 设置视频输出
player->setVideoOutput(videoWidget);
// 设置默认音量滑动条
// 音量实际设置的是 当前值/最大值 * 当前系统音量大小
ui->horizontalSlider_volume->setValue(99);
connect(ui->horizontalSlider_volume, &QSlider::valueChanged, this, [=](int value) {
// audioOutput->setVolume(value / 100.0 );
qreal linearVolume =
// 线性 <-> 对数
QAudio::convertVolume(
value / qreal(100.0),
QAudio::LogarithmicVolumeScale,
QAudio::LinearVolumeScale
);
audioOutput->setVolume(linearVolume);
});
ui->pushButton_add->setIcon(QIcon(".\\icons\\add.png"));
ui->pushButton_play->setIcon(QIcon(".\\icons\\play.png"));
ui->pushButton_pause->setIcon(QIcon(".\\icons\\pause.png"));
ui->pushButton_stop->setIcon(QIcon(".\\icons\\stop.png"));
ui->pushButton_sound->setIcon(QIcon(".\\icons\\vol.png"));
connect(ui->pushButton_add, &QPushButton::clicked, this, &VidePlayer::openfile);
connect(ui->pushButton_play, &QPushButton::clicked, player, &QMediaPlayer::play);
connect(ui->pushButton_pause, &QPushButton::clicked, player, &QMediaPlayer::pause);
connect(ui->pushButton_stop, &QPushButton::clicked, player, &QMediaPlayer::stop);
// 播放器播放位置 映射到 滑动条位置
connect(player, &QMediaPlayer::positionChanged, this, &VidePlayer::positionChanged);
// 打开新文件, 视频总时长 映射到 进度条最大值
connect(player, &QMediaPlayer::durationChanged, this, &VidePlayer::durationChanged);
// 用户按下 slider
connect(ui->horizontalSlider_pos, &QSlider::sliderPressed, this, [=]() {
isSliderPressed = true;
});
// 用户释放 slider,滑动条新位置 映射到 播放器播放位置
connect(ui->horizontalSlider_pos, &QSlider::sliderReleased, this, [=]() {
isSliderPressed = false;
player->setPosition( ui->horizontalSlider_pos->value() * 1000 );
});
// 播放失败
connect(player, &QMediaPlayer::errorOccurred, this,
[=](QMediaPlayer::Error error, const QString &errorString) {
qDebug() << error << errorString;
});
}
VidePlayer::~VidePlayer()
{
delete ui;
}
void VidePlayer::openfile()
{
QString fileName =
QFileDialog::getOpenFileName(this, "选择视频", "", "Video Files (*.mp4 *.avi *.mkv)");
if(fileName.isEmpty())
return;
player->setSource(QUrl::fromLocalFile(fileName));
player->play();
QFileInfo fileInfo(fileName);
QString name = fileInfo.completeBaseName();
//ui->label_cur_media->setText(name);
setWindowTitle(name);
}
void VidePlayer::positionChanged(qint64 pos)
{
// 用户正在拖动时
// 不自动更新 slider
if(isSliderPressed) return;
ui->horizontalSlider_pos->setValue(pos / 1000);
int sec = pos / 1000;
int min = sec / 60;
int hour = min / 60;
sec = sec % 60;
int s = duration / 1000;
int m = s / 60;
int h = m / 60;
s = s % 60;
ui->label_pos->setText(
QString("%1:%2:%3/%4:%5:%6")
.arg(hour, 2, 10, QChar('0'))
.arg(min, 2, 10, QChar('0'))
.arg(sec, 2, 10, QChar('0'))
.arg(h, 2, 10, QChar('0'))
.arg(m, 2, 10, QChar('0'))
.arg(s, 2, 10, QChar('0'))
);
}
void VidePlayer::durationChanged(qint64 duration)
{
ui->horizontalSlider_pos->setRange(0, duration / 1000);
this->duration = duration;
}