基于QMediaPlayer的简易视频播放器

  • 1、创建基本布局
  • 2、QMediaPlayer的基本使用
  • 3、结合QSlider实现播放进度控制和音量控制
  • 4、重载QSlider鼠标响应事件,实现单击跳转至任意位置

3、结合QSlider实现播放进度控制和音量控制

3.1 进度控制

QSlider类继承自QAbstractSlider类,可以参考 [ 官方文档 ]

其自带的信号如下:

Signal Description
valueChanged() 当进度值改变时触发
sliderPressed() 当用户按下滑块时触发
sliderMoved() 当用户拖动滑块时触发
sliderMoved() 当用户释放滑块时触发

对于播放器来说,其进度条应该有两种控制方式,一是拖动,二是点击。
其中我们需要用到sliderMoved()和sliderReleased()两种信号来实现拖动功能,

对于点击,QSlider的mousePressEvent()默认的方式是,点击之后跳跃一定的固定距离,无法实现“指哪打哪”,因此我们需要对mousePressEvent()进行重写。具体方法将在下一篇文章中介绍。

首先在ui载入时将Slider禁用,等到文件载入时才启用。然后连接三组信号槽,第一组是由重载的mousePressEvent事件发送的,为避免混淆换了个costomSliderClicked的名字。其余两组是QSlider自带的sliderMoved和sliderReleased信号。

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);ui->slider_progress->setEnabled(false);connect(ui->slider_progress,&CustomSlider::costomSliderClicked,this,&MediaPlayer::slider_progress_clicked);connect(ui->slider_progress,&CustomSlider::sliderMoved,this,&MediaPlayer::slider_progress_moved);connect(ui->slider_progress,&CustomSlider::sliderReleased,this,&MediaPlayer::slider_progress_released);
}

首先我们需要配合定时器QTimer实现Slider随播放进度而移动。
之所以选择QTimer,而不是player的positionChanged信号来驱动,是因为positionChange和后面要用的QSlider两个信号槽互相修改,容易出现冲突。

添加QTimer头文件,并定义全局变量

#include <QTimer>//与Slider有关的播放控制变量
QTimer * timer;
int maxValue = 1000;//设置进度条的最大值

在on_pushButton_open_file_clicked槽函数中添加Slider和Timer的相关代码,并将timer连接至onTimerOut槽函数:

void MediaPlayer::on_pushButton_open_file_clicked()
{//前面部分代码与第2篇中相同////启用slider并设置范围ui->slider_progress->setEnabled(true);ui->slider_progress->setRange(0,maxValue);timer = new QTimer();timer->setInterval(1000);timer->start();//将timer连接至onTimerOut槽函数connect(timer, SIGNAL(timeout()), this, SLOT(onTimerOut()));
}

添加定时器的槽函数onTimerOut(),其原理就是根据一定的间隔(本例中为1000ms)刷新Slider的值,这个值是根据播放器player的position(当前位置)和duration(总时长)计算出来的:

void MediaPlayer::onTimerOut()
{ui->slider_progress->setValue(player->position()*maxValue/player->duration());
}

到这里就实现了Slider随进度移动的功能,接下来添加控制代码。
三个槽函数分别对应单击、拖动和释放。在拖动过程中,可以先暂停计时器,等用户拖动完成释放之后,再重启定时器。这样防止用户在拖动过程中滑块依然按照定时器触发进行移动,瞎跳,闹心。

void MediaPlayer::slider_progress_clicked()
{player->setPosition(ui->slider_progress->value()*player->duration()/maxValue);
}void MediaPlayer::slider_progress_moved()
{//暂时停止计时器,在用户拖动过程中不修改slider的值timer->stop();player->setPosition(ui->slider_progress->value()*player->duration()/maxValue);
}void MediaPlayer::slider_progress_released()
{//用户释放滑块后,重启定时器timer->start();
}

3.2 音量控制

音量控制的方法与进度控制非常相似,可以直接使用重载后的CustomSlider类。这里我们不在Designer中拖入控件,而是通过手动实现的方式来添加音量控制的Slider。

首先在mediaplayer.cpp的构造函数中继续添加初始化内容

MediaPlayer::MediaPlayer(QWidget *parent) :QMainWindow(parent),ui(new Ui::MediaPlayer)
{/*与上述相同*//*……*///手动设置slider_volume 包括初始化 方向 禁用,以及槽函数slider_volume = new CustomSlider(this);slider_volume->setOrientation(Qt::Vertical);slider_volume->setEnabled(false);slider_volume->hide();//由于不涉及到slider值的刷新,因此只需对move和自定义click两个信号进行处理,并且可以共用一个槽函数connect(slider_volume,&CustomSlider::costomSliderClicked,this,&MediaPlayer::slider_volume_changed);connect(slider_volume,&CustomSlider::sliderMoved,this,&MediaPlayer::slider_volume_changed);}

槽函数

//音量控制Slider的槽函数
void MediaPlayer::slider_volume_changed()
{player->setVolume(slider_volume->value());
}

音量控制按钮的槽函数,通过hide()和show()方法,实现音量控制Slider的唤出和收起

bool state_slider_volume = false;
void MediaPlayer::on_pushButton_volume_clicked()
{if(state_slider_volume){slider_volume->hide();}else{slider_volume->setValue(player->volume());//计算位置,使其位于音量控制按钮的上方slider_volume->setGeometry(QRect(ui->pushButton_volume->pos().rx()+0.5*ui->pushButton_volume->width()-15, ui->pushButton_volume->y()-100 , 30, 102));slider_volume->show();}state_slider_volume = !state_slider_volume;
}

其效果如图

到这里,QSlider的移动与控制功能就已经完成了,但是实际上我们需要重载QSlider的mousePressEvent以实现指哪打哪的效果,因此需要继承一个新类CustomSlider,详情见第4篇
[ 重载QSlider鼠标响应事件,实现单击跳转至任意位置]

【基于QMediaPlayer的简易视频播放器】— 3、结合QSlider实现播放进度控制和音量控制相关推荐

  1. 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  2. 基于IJKPlayer的简易视频播放器

    写在前面 PS:没错,这就是那篇躺在草稿箱里好几个月的僵尸博客,直到现在(2017年1月中旬)才打算写完,简单总结一下知识点,以备不时之需. 现在的项目是一个电影预告的APP,必然得有个视频播放器,之 ...

  3. Linux 基于ffplay的简易视频播放器(网络+本地)

    新手刚开始学习ffmpeg. 参考网上的ffmpeg资料和雷神的博客,简易做了个播放器,边学边做. 暂时未做音频,所以播放时有沙沙声. 视频的播放速度也有问题,需要再调整,后续再处理速度和音频的问题! ...

  4. QT应用编程:基于QMediaPlayer开发音视频播放器

    一.环境介绍 操作系统: win10 64位 QT版本:  QT5.12.6 编译器:  MinGW 32 二.解码器下载地址 QMediaPlayer是Qt提供的一个跨平台媒体播放器类,它没有自带解 ...

  5. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  6. 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  7. C语言基于GTK+Libvlc实现的简易视频播放器(二)

    简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显示视频播放进度,但即使作为一个视频播放器,只有这些 ...

  8. 基于 FFmpeg 的跨平台视频播放器简明教程(四):像素格式与格式转换

    系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程(一):FFMPEG + Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程(二):基础知识和解封装(demux) 基于 ...

  9. java视频播放器制作_java创建简易视频播放器

    java创建简易视频播放器 发布时间:2020-09-23 04:28:09 来源:脚本之家 阅读:98 作者:南柯一梦xihe 最近有个多媒体的作业,要求使用visualC++和OpenCV编写一个 ...

最新文章

  1. C++ 随机数生成的2种方法--生成指定范围内的随机数
  2. 使用 monitor 命令查看 redis 请求日志
  3. Android的基本常用的短信操作
  4. (二十)TCPIP面试宝典-进入大厂必备总结(中)
  5. mysql删除记录后id不连续_Mysql数据库中使用DELETE语句时,一般删除一条记录后ID会不连续,才能让序号继续按顺序排列?...
  6. easyexcel多个sheet导入_Java中Easypoi实现excel多sheet表导入导出功能
  7. linux redis图形界面,linux安装redis和windows安装可视化工具
  8. 01-复杂度1 最大子列和问题(剑指offer和PAT)
  9. 明略数据获 10 亿人民币 C 轮融资,华兴新经济基金、腾讯领投
  10. http1.0 与 http1.1
  11. 数据--第31课 - 树的存储结构
  12. fread函数在C语言中的用法,c语言fread函数的用法
  13. 飞思卡尔芯片k66单片机溢出_飞思卡尔HCS12系列 Flash的加密解密解决方法
  14. 常见3DMAX插件导出模型丢失贴图问题
  15. java 后加_java中的前加加++和后加加++,有很多人搞的很晕,不太明白!今天我举几个例子说明下前++和后++的区别!其实大家只要记住一句话就可以了,前++是先自加再使...
  16. 前端实现导入(excel文件)导出(word)文件
  17. STM32通过IIC驱动MLX90614红外温度传感器
  18. 红帽linux认证的有效期,红帽RHCE证书过期怎么办
  19. 盛迈坤电商:店铺详情页设置的特点
  20. R语言 tidyverse 之数据处理:dplyr (中)

热门文章

  1. 自定义view实现涂鸦(画板)功能
  2. 极速办公(ppt)文字如何设置斜体
  3. iOS 开发笔记-获取某个APP素材
  4. 负载均衡获得真实源IP的6种方法
  5. 校招详解(术语、时间、流程)
  6. 解决chm文档字体太小的问题
  7. 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇
  8. 双臂模式DPVS+RPM安装教程
  9. (适配多个版本)双击 DWG 文件以使用 AutoCAD 产品打开时显示“Windows 找不到 [文件名].acad.exe ”
  10. typescript函数和类的基础