QMediaPlayer播放视频

news/2024/12/23 13:40:44/

简介

使用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.ppmy.cn/news/987659.html

相关文章

Form1单例模式与互斥锁

一、使用mutex来解决。 如何让窗体Form1也是一个单例模式呢&#xff1f; 在窗体项目中找到Program.cs&#xff0c;双击。找到入口点&#xff0c;更改如下&#xff1a; [STAThread]private static void Main(){string mutexName "MyapplicatonMutexApp1121";usin…

Vue2 第三节 数据代理和事件处理

1.Object.defineProperty 方法 2.数据代理 3.Vue中的数据代理 4.事件的基本使用 5.事件修饰符 6.键盘事件 一.Object.defineProperty 方法 &#xff08;1&#xff09;学习Object.defineProperty为下一节数据代理做准备 &#xff08;2&#xff09;更加高级的给对象添加属…

誉天程序员-2301-3-day07

文章目录 知识回顾实现一个业务功能点所需要小的技术点&#xff0c;这些点功能组成就完成整个功能1、声明一个菜单项&#xff08;配置路由&#xff09;2、去写菜单 menu.vue动态加载组件 3、创建/admin/user.vue4、常用的页面组件 知识回顾 实现一个业务功能点所需要小的技术点…

计算机网络(1) --- 网络介绍

目录 1.介绍协议 基础知识 协议 协议分层 OSI七层模型 2.TCP/IP五层模型 3.网络传输的基本流程 1.基本知识 协议报头 2.局域网通信的基本流程 3.网络传输流程 局域网分类 跨路由器传输 数据包封装和分用 4.网络中的地址管理 1.IP地址 2.MAC地址 3.区别 1.介绍…

华为云NFS使用API删除大文件目录

最近在使用华为云SFS时&#xff0c;如果一个目录存储文件数超过100W&#xff0c;执行 “rm -rf path”时&#xff0c;存在删不动的情况&#xff0c;可以使用华为云API接口&#xff0c;执行异步删除。 华为官网&#xff1a; 删除文件系统目录_弹性文件服务 SFS_API参考_SFS Tu…

深入理解python with 语句,自定义上下文管理器

python中with 语句作为try/finally 编码范式的一种替代, 适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的”清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等 1. 使用with打开文件 你应该见过下面这种打开文件的方式 w…

Linux服务器增加虚拟交换内存

文章目录 swap分区的创建1、查看磁盘使用情况2、添加Swap分区3、对交换文件格式化并转换为swap分区4、挂载并激活分区5、查看新swap分区是否正常添加并激活使用6、修改 fstab 配置&#xff0c;设置开机自动挂载该分区7、查看是否已经使用了交换内存 更改Swap配置查看当前的swap…

进入linux系统中修改网段-ip

第一步 &#xff1a;开启虚拟机 cd 到 /etc/sysconfig/network-scripts 目录下&#xff0c;输入命令给ls,展示这个目录下文件和文件夹 第二步&#xff1a;进入到以ifcfg开头的文件 # ifcfg开头的文件&#xff0c;如果有多个网卡&#xff0c;有多个ifcfg-ensxx文件 命令…