QMediaPlayer播放视频

news2024/9/23 13:24:15

简介

使用QT的QMediaPlayer类播放MP4格式的视频。

代码示例

头文件

Ui::MainWindow *ui;
QMediaPlaylist *playlist;
QMediaPlayer *player;
QVideoWidget *videoWidget;

方式一

应用窗体外播放视频。

.cpp文件

 playlist = new QMediaPlaylist;
 playlist->addMedia(QUrl("qrc:/video/sample5s.mp4"));
 playlist->addMedia(QUrl("qrc:/video/SampleVideo1mb.mp4"));
 playlist->setCurrentIndex(0);

 player = new QMediaPlayer;
 player->setPlaylist(playlist);

 videoWidget = new QVideoWidget;
 videoWidget->setFixedSize(1366,768); //设置video窗体大小
 videoWidget->setWindowFlag(Qt::FramelessWindowHint); //设置无边框
 player->setVideoOutput(videoWidget);
 videoWidget->show();

 player->play();

效果如下

在这里插入图片描述

方式二

UI设计器界面拖拽一个Widget,右键提升为QVideoWidget,窗体内播放视频;

.cpp文件

player = new QMediaPlayer;
playlist = new QMediaPlaylist(player);

playlist->addMedia(QUrl("qrc:/video/sample5s.mp4"));
playlist->addMedia(QUrl("qrc:/video/SampleVideo1mb.mp4"));
playlist->setCurrentIndex(0);
playlist->setPlaybackMode(QMediaPlaylist::Loop);//循环播放
player->setPlaylist(playlist);

ui->videowidget->setAspectRatioMode(Qt::IgnoreAspectRatio);//自适应铺满界面
//ui->videowidget->setFullScreen(true);  //全屏
player->setVideoOutput(ui->videowidget);
player->play();

效果如下**

在这里插入图片描述

QMediaPlayer播放视频常见信号处理

常用信号及其绑定

//播放进度
connect(player,&QMediaPlayer::positionChanged,this,&MainWindow::updatePosition);

//媒体状态
connect(player, &QMediaPlayer::mediaStatusChanged, this, &MainWindow::mediaStatusChanged);

//播放错误状态捕获
connect(player, static_cast<void(QMediaPlayer::*)(QMediaPlayer::Error)>
        (&QMediaPlayer::error), this, &MainWindow::showError);

//播放状态
connect(player, &QMediaPlayer::stateChanged, this, &MainWindow::stateChanged);

//获取元数据
connect(player, &QMediaPlayer::metaDataAvailableChanged,
           this, &MainWindow::metaDataAvailableChanged);

对应槽函数处理方法

//position 为当前播放时长,不播放则为0
//player->duration() 为视频的总时长,但当视频还没有加载完成时返回为0
void MainWindow::updatePosition(qint64 position)
{
    if(position > 0)
    {
        ui->videowidget->setVisible(true);
    }

    //不使用QMediaPlaylist时,实现循环播放
    if(position == player->duration())
    {
        if(player->duration() != 0)
        {
            player->play();
        }
    }
}

void MainWindow::mediaStatusChanged(QMediaPlayer::MediaStatus status)
{
    switch (status) {
    case QMediaPlayer::UnknownMediaStatus:
        ui->label->setText(tr("媒体未知状况!"));
        break;
    case QMediaPlayer::NoMedia:
        ui->label->setText(tr("没有媒体文件!"));
        break;
    case QMediaPlayer::BufferingMedia:
        ui->label->setText(tr("正在缓冲媒体文件!"));
        break;
    case QMediaPlayer::BufferedMedia:
        ui->label->setText(tr("媒体文件缓冲完成!"));
        break;
    case QMediaPlayer::LoadingMedia:
        ui->label->setText(tr("正在加载媒体!"));
        break;
    case QMediaPlayer::StalledMedia:
        ui->label->setText(tr("播放停滞!"));
        break;
    case QMediaPlayer::EndOfMedia:
        ui->label->setText(tr("播放结束!"));
        break;
    case QMediaPlayer::LoadedMedia:
        ui->label->setText(tr("媒体加载完成!"));
        break;
    case QMediaPlayer::InvalidMedia:
        ui->label->setText(tr("不可用的媒体文件!"));
        break;
    default: break;
    }
}

void MainWindow::stateChanged(QMediaPlayer::State state)
{
    switch (state) {
    case QMediaPlayer::StoppedState:
        ui->label_2->setText(tr("停止状态!"));
        break;
    case QMediaPlayer::PlayingState:
        ui->label_2->setText(tr("播放状态!"));
        break;
    case QMediaPlayer::PausedState:
        ui->label_2->setText(tr("暂停状态!"));
        break;
    default: break;
    }
}

void MainWindow::showError(QMediaPlayer::Error error)
{
    switch (error) {
    case QMediaPlayer::NoError:
        ui->label_3->setText(tr("没有错误!"));
        break;
    case QMediaPlayer::ResourceError:
        ui->label_3->setText(tr("媒体资源无法被解析!"));
        break;
    case QMediaPlayer::FormatError:
        ui->label_3->setText(tr("不支持该媒体格式!"));
        break;
    case QMediaPlayer::NetworkError:
        ui->label_3->setText(tr("发生了一个网络错误!"));
        break;
    case QMediaPlayer::AccessDeniedError:
        ui->label_3->setText(tr("没有播放权限!"));
        break;
    case QMediaPlayer::ServiceMissingError:
        ui->label_3->setText(tr("没有发现有效的播放服务!"));
        break;
    default:
        ui->label_3->setText(tr("未知错误码!"));
        break;
    }
}

// 获取元数据
void MainWindow::metaDataAvailableChanged(bool available)
{
    if(available)
    {
        QString title = player->metaData("Title").toString();
        QString author = player->metaData("Author").toString();
        setWindowTitle(title + "-" + author);
    }
}

状态处理,引用部分内容
https://blog.csdn.net/zhaoyun_zzz/article/details/90290552

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

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

相关文章

ShardingSphere-Proxy垂直分片详解与实战

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

python:图片修改尺寸和裁剪

作者:CSDN @ _养乐多_ 本文记录了使用python语言的PIL库对jpg格式的图像进行修改尺寸,按指定像素间隔裁剪的代码。 文章目录 一、修改图片尺寸二、按照指定像素裁剪图片2.1 将小块保存在本地2.2 将小块以一定间隔生成新的图片原图: 一、修改图片尺寸 修改尺寸后, from PI…

c++学习(布隆过滤器)[23]

布隆 布隆过滤器&#xff08;Bloom Filter&#xff09;是一种概率型数据结构&#xff0c;用于判断一个元素是否可能存在于一个集合中。它使用多个哈希函数和位图来表示集合中的元素。 布隆过滤器的基本原理如下&#xff1a; 初始化&#xff1a;创建一个长度为m的位图&#xf…

ARM 详解

一、ARM 的发展史 ARM 的发展历史可以追溯到 1978 年&#xff0c;当年克里斯库里&#xff08;Chris Currry&#xff09;所任职的公司遭遇财务危机&#xff0c;发展每况愈下&#xff0c;库里在和创始人深入沟通后&#xff0c;决定离职。当时的库里对微型计算机很感兴趣&#xf…

大致了解Redis

为了保证数据的可靠性&#xff0c;Redis 需要在磁盘上读写 AOF 和 RDB&#xff0c;但在高并发场景里&#xff0c;这就会直接带来两个新问题&#xff1a;一个是写 AOF 和RDB 会造成 Redis 性能抖动&#xff0c;另一个是 Redis 集群数据同步和实例恢复时&#xff0c;读 RDB 比较慢…

什么是EPC?

文章目录 一、什么是EPC&#xff1f;二、EPC的优势和特征2.1、EPC的优势2.2、EPC的特征 三、EPC项目管理平台3.1、平台简介3.2、平台优势3.3、平台功能模块 一、什么是EPC&#xff1f; EPC&#xff08;Engineering Procurement Construction&#xff09;是指公司受业主委托&am…

MySQL中锁的简介——表级锁-元数据锁、意向锁

1.元数据锁 查看元数据锁 select object_type,object_scheme,object_name,lock_type,lock_duration from perfomance_scheme.metadata_locks;2.意向锁 线程A开启事务后在执行update更新语句时候&#xff0c;会给数据加上行锁&#xff0c;加上行锁以后&#xff0c;会对整张表加…

JMM是如何保证原子性呢?

3.3.1加锁 锁是一种通用技术&#xff0c;比如Java提供的Synchronized关键字就是锁的一种实现&#xff0c;Synchronized是排他锁/独占锁&#xff0c;就是有你没我的意思&#xff0c;只要其他线程到来访问&#xff0c;发现锁还未释放&#xff0c;就要在外面等待&#xff0c;因为S…

【雕爷学编程】Arduino动手做(175)---机智云ESP8266开发板模块6

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Docker 入门终极指南[详细]

前言 富 Web 时代&#xff0c;应用变得越来越强大&#xff0c;与此同时也越来越复杂。集群部署、隔离环境、灰度发布以及动态扩容缺一不可&#xff0c;而容器化则成为中间的必要桥梁。 本节我们就来探索一下 Docker 的神秘世界&#xff0c;从零到一掌握 Docker 的基本原理与实…

Nginx配置WebSocket反向代理

1、WebSocket协议 ​ WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯&#xff0c;直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容&#xff0c;它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的…

Java8使用CompletableFuture实现多异步任务同步等待结果

一、应用场景 在实际的开发工作中&#xff0c;我们可能会遇到一些比较复杂且耗时的功能&#xff0c;例如一个业务数据表格的导出&#xff0c;假定业务数据表本身都很大&#xff0c;需要组装的数据又比较多&#xff0c;就会造成整个实现过程很耗时甚至可能出现接口请求超时&…

Android 之 MediaPlayer 播放音频与视频

本节引言&#xff1a; 本节带来的是Android多媒体中的——MediaPlayer&#xff0c;我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件&#xff0c;通过该类&#xff0c;我们可以以最小的步骤来获取&#xff0c;解码 和播放音视频。它支持三种不同的…

Carla教程三:参考线平滑理论完全解析(二次规划)

参考线平滑理论 决策规划流程第一步是参考线的生成&#xff0c;然后将障碍物进行投影到以参考线为坐标轴的frenet坐标系。参考线是很关键的一部&#xff0c;解决了导航路径过长&#xff0c;不平滑&#xff0c;不利于坐标转换找匹配点的问题。利用参考线&#xff0c;每一个规划…

LeetCode 2050. Parallel Courses III【记忆化搜索,动态规划,拓扑排序】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

适用于 Windows 10/11 的 10 款最佳免费 PDF 阅读器软件

PDF 文档非常受欢迎&#xff0c;因为它们可以在任何操作系统上打开&#xff0c;并且很容易附加到电子邮件、消息或网站中。PDF 文档还具有不易更改的优点。因此&#xff0c;它被个人和组织广泛用于简历、学习材料、文档以及外围设备和设备手册的数字副本。 PDF 阅读器软件可帮…

【JavaEE初阶】Servlet (三)MessageWall

在我们之前博客中写到的留言墙页面,有很严重的问题:(留言墙博客) 如果刷新页面/关闭页面重开,之前输入的消息就不见了.如果一个机器上输入了数据,第二个机器上是看不到的. 针对以上问题,我们的解决思如如下: 让服务器来存储用户提交的数据,由服务器保存. 当有新的浏览器打开页…

Python 基础(十七):库

❤️ 博客主页:水滴技术 🌸 订阅专栏:Python 入门核心技术 🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬 文章目录 一、Python库的概念二、常用标准库2.1、数字和数学2.2、文件和目录操作2.3、时间和日期2.4、网络通信2.5、并发和多线程2.6、数据压缩和归档2.7、数据序列化…

深度专访盖国强丨《TVP技术指针:共创国产数据库的“中国时刻”》

日前&#xff0c;腾讯云《TVP技术指针》栏目对云和恩墨创始人盖国强进行了深度专访。从专业DBA到创立云和恩墨公司&#xff0c;从 Oracle ACE 国内第一人到国产数据库的践行者&#xff0c;伴随中国数据库成长的二十年&#xff0c;他有哪些思考、判断、行动和远见&#xff1f;在…

苍穹外卖-day05

苍穹外卖-day05 本项目学自黑马程序员的《苍穹外卖》项目&#xff0c;是瑞吉外卖的Plus版本 功能更多&#xff0c;更加丰富。 结合资料&#xff0c;和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6/?sp…