QT 使用QMediaPlayer实现的简易视频播放器

news2024/12/26 23:31:32

文章目录

      • 效果图
      • 功能点
      • 类介绍
      • 代码介绍
      • 总结

QT 使用QMediaPlayer实现的简易视频播放器

效果图

在这里插入图片描述

功能点

  1. 播放指定视频
  2. 全屏/退出全屏
  3. 开始/暂停/重置视频
  4. 拖拽到指定位置播放

类介绍

  • 需要在配置文件中加入Multimedia, MultimediaWidgets这俩个库。
  • Multimedia:提供了一套用于处理音频、视频、摄像头和广播数据的API。
  • MultimediaWidgets:提供了一些与多媒体相关的图形界面组件。
  • QVideoProbe是Qt多媒体模块中的一个类,它用于监控视频流的输出。这个类允许你接收视频帧的数据,而不需要直接与视频输出设备交互。
  • QMediaPlayer 使用生产者-消费者模型来处理媒体内容。它从媒体源(如文件或网络流)获取数据,然后通过播放控制接口(如播放、暂停、停止)和播放状态接口(如当前播放位置、总时长)来控制媒体内容的播放。
  • 使用 QMediaPlayer时,通常需要将其与一个或多个媒体输出组件结合使用,例如QVideoWidget用于视频播放,QAudioOutput用于音频播放。

注意:在Qt6中使用QMediaPlayer时,使用的是setSource函数设置视频资源,而Qt5中并没有这个函数,使用的是setMedia函数。而且有个非常坑的地方,Qt6设置完QVideoWidget直接使用没有问题,而Qt5就会存在问题。
信息栏会报错:

DirectShowPlayerService::doRender: Unresolved error code 0x80040266 

这极具迷惑性,当去百度时,你就会看到一堆让你LAV安装解码器的,安装后并没有什么用
最后看到Qt5一个官方的示例才解决,需要设置QVideoProbe
在这里插入图片描述

    m_player = new QMediaPlayer(this);
    m_videoProbe = new QVideoProbe(this);
    m_videoProbe->setSource(m_player);

代码介绍

  1. 信号与槽
    ///当QMediaPlayer的durationChanged信号发出时,Player类的durationChanged槽函数将被调用。durationChanged槽函数更新播放器的总时长。
    connect(m_player, &QMediaPlayer::durationChanged, this, &Player::durationChanged);
    ///当QMediaPlayer的positionChanged信号发出时,Player类的positionChanged槽函数将被调用。positionChanged槽函数通更新播放器的当前播放位置。
    connect(m_player, &QMediaPlayer::positionChanged, this, &Player::positionChanged);
    ///当移动进度条时,Player类的seek槽函数将被调用,从而改变媒体的播放位置。建立了媒体播放器进度条(QSlider)与播放器(Player)的连接
    connect(m_slider, &QSlider::sliderMoved, this, &Player::seek);
    //当点击进度条时,它将m_player的播放位置设置为点击处的值
    connect(m_slider, &ClickableSlider::clickedSlider, this, [&]()
            { m_player->setPosition(m_slider->value() * 1000); });
    //暂停/播放按钮
    connect(controlButton, &QPushButton::clicked, [&]()
            {
        if (m_player->state() == QMediaPlayer::PlayingState) {
            m_player->pause();
        } else {
            m_player->play();
        } });
    //退出按钮
    connect(eixtButton, &QPushButton::clicked, this, [&]()
            { close(); });
  1. 当前播放时间文本
  • 在槽函数positionChanged中被调用。
void Player::updateDurationInfo(qint64 currentInfo)
{
    QString tStr;
    if (currentInfo || m_duration)
    {
        QTime currentTime((currentInfo / 3600) % 60, (currentInfo / 60) % 60,
                          currentInfo % 60, (currentInfo * 1000) % 1000);
        QTime totalTime((m_duration / 3600) % 60, (m_duration / 60) % 60,
                        m_duration % 60, (m_duration * 1000) % 1000);
        QString format = "mm:ss";
        if (m_duration > 3600)
            format = "hh:mm:ss";
        tStr = currentTime.toString(format) + " / " + totalTime.toString(format);
    }
    m_labelDuration->setText(tStr);
}
  1. 全屏
  • QVideoWidget有设置全屏的函数setFullScreen直接调用就行。
void VideoWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
    setFullScreen(!isFullScreen());
    event->accept();
}
  1. 点击进度条位置播放
  • 自定义一个进度条QSlider,重写点击函数,主动触发自定义clickedSlider信号,链接上述的信号与槽。
void ClickableSlider::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        // 根据点击位置计算新的值
        qreal value = minimum() + ((qreal)(maximum() - minimum()) * event->pos().x()) / width();
        setValue(value);
        emit clickedSlider();
        event->accept();
    }
    QSlider::mousePressEvent(event);
}

总结

  • 知识理应共享,源码在此。
  • 这个案例功能相对简单,若是你想要更多功能,可以看看Qt案例。
  • qt6与qt5的API使用方式还是不一样的,这点需要注意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1574224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Qt 学习笔记】Qt 中出现乱码的解释及讨论

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt 中出现乱码的解释及讨论 文章编号:Qt 学习笔记 / 06 文…

FJSP:蜣螂优化算法( Dung beetle optimizer, DBO)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题(Flexible Job Shop Scheduling Problem,FJSP),是一种经典的组合优化问题。在FJSP问题中,有多个作业需要在多个机器上进行加工,每个作业由一系列工序组成&a…

一种有效的隐私保护联邦学习方法-文章翻译

一种有效的隐私保护联邦学习方法 摘要 联邦学习已成为协作学习和隐私保护学习的一种很有前途的方法。联合学习过程中的参和者通过交换模型参数而不是实际的训练数据(他们可能希望保持私有)来合作训练模型。然而,参数交互和生成的模型仍然可能会披露有关所用训练数据的信息…

Mysql故障解析

目录 一、Mysql单实例故障排查 1.故障一 2.故障二 3.故障三 4.故障四 5.故障五 6.故障六 7.故障七 8.故障八 二、Mysql主从故障排查 1.故障一 2.故障二 3.故障三 三、Mysql优化 1.硬件方面 (1)关于CPU (2)关于内…

在线监测系统在水厂水质管理工程中的应用与研究

【摘要】:随着水厂水质管理技术和管理水平的提升,达到了在线监测系统通过监测数据的反馈,及时发现问题,快速处理事故,优化了水资源的利用率,提高了供水系统的稳定性和安全性,从而有效地提高供水…

2024.4.4-day09-CSS 布局模型(标准流模型、浮动模型)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 2024.4.4-学习笔记1 CSS 布局模型1.1 标准流1.2 CSS 浮动1.3 去除塌陷 2…

RabbitMQ的交换机与队列

一、流程 首先先介绍一个简单的一个消息推送到接收的流程,提供一个简单的图 黄色的圈圈就是我们的消息推送服务,将消息推送到 中间方框里面也就是 rabbitMq的服务器,然后经过服务器里面的交换机、队列等各种关系(后面会详细讲&am…

文件读写(相关函数详解)

1.文件的顺序读写 相关函数: 1.1 fputc函数 fputc的参数如下 它的功能是把字符character输出到stream指向的文件中,字符的本质就是它的ascll值所以这里用int类型接收。如果写入成功则返回写入的字符的ascll码,失败则返回-1(即EOF) 示例代码…

【洛谷】P9236 [蓝桥杯 2023 省 A] 异或和之和

题目链接 P9236 [蓝桥杯 2023 省 A] 异或和之和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 1. 暴力求解 直接枚举出所有子数组,求每个子数组的异或和,再对所有的异或和求和 枚举所有子数组的时间复杂度为O(N^2)&…

C++ 【原型模式】

简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象,客户端不需要知道要复制的对象是哪个类的实例,只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类,客户端代码无需改变,只需修改原型工…

线程安全--深入探究线程等待机制和死锁问题

꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转…

影院座位选择简易实现(uniapp)

界面展示 主要使用到uniap中的movable-area&#xff0c;和movable-view组件实现。 代码逻辑分析 1、使用movable-area和movea-view组件&#xff0c;用于座位展示 <div class"ui-seat__box"><movable-area class"ui-movableArea"><movab…

C++ 内存分配时地址对齐

如果数据地址的对齐与CPU相兼容&#xff0c;那么CPU读写内存时性能会更高。 因此在C中&#xff0c;有时会希望在堆或栈中分配内存时&#xff0c;返回的地址能按照特定的长度对齐。 如果希望在栈中分配的内存时&#xff0c;返回地址按照特定长度对齐&#xff0c;可以使用 alig…

IVS模型解释

核心思路 【Implied volatility surface predictability: The case of commodity markets】 半参数化模型&#xff1a;利用各种参数(或者因子)对隐含波动率进行降维&#xff08;静态参数化因子模型&#xff09;&#xff0c;对参数化因子的时间序列进行间接的建模 基于非对称…

蓝桥杯 十一届C++A组 字符排序 21分(运行超时)

思路&#xff1a; 1. 此题考查的冒泡排序中的交换次数&#xff0c;其实就是考察当前数与后面的逆序对个数问题。而为了最大利用位数&#xff0c;应当使每一位都不小于后面的字符&#xff0c;否则会造成一次逆序对的浪费&#xff08;贪心&#xff0c;为了使总位数最少&#xff…

代码随想录算法训练营三刷 day45 | 动态规划 之 70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数

三刷day45 70. 爬楼梯 &#xff08;进阶&#xff09;1. 确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例来推导dp数组 322. 零钱兑换1. 确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组 279.完全平方…

01.IDEA中出现Cannot resolve symbol ‘SpringApplication异常

试了很多次&#xff0c;看了这篇文章终于发现了问题。IDEA解决springboot工程中Cannot resolve symbol SpringApplication异常-CSDN博客 我存在的问题在于Maven home path有误&#xff0c;改正之后就没有问题&#xff0c;不标红了。

逆向案例十二——看准网企业信息json格式的信息

网址&#xff1a;【全国公司排行|排名榜单|哪家好】-看准网 打开开发者工具——刷新——网络——XHR——下滑页面加载新的页面——找到数据包 发现参数加密&#xff0c;返回的数据也进行了加密 按关键字在下方搜索 kiv进入第一个js文件 ctrlf打开文件里面的搜索框继续搜kiv找到…

【机器学习入门】使用YOLO模型进行物体检测

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 第6章 人工神经网络(一) 第6章 人工神经网络(二) 卷积和池化 第6章 使用pytorch进行手写数字识别 文章目录 系列文章目录前…

ECAI 2024投稿指南

诸神缄默不语-个人CSDN博文目录 ECAI也写一下&#xff0c;作为备胎。毕竟ECAI是CCF B会。 ECAI dblp官网&#xff1a;https://dblp.uni-trier.de/db/conf/ecai/index.html 征文网址&#xff1a;https://www.ecai2024.eu/calls/main-track ECAI 2024在西班牙开&#xff0c;如…