QMediaPlayer+QVideoWidget+QAudioOutput实现一个简单视频播放器-Qt6.8
此篇是我在观看使用nginx搭建音视频点播服务器 - seedoubleu - 博客园后,想着使用qt widget写的一个简单播放器
完成nginx搭建音视频点播服务器的话,我推荐使用ffplay进行验证.再推荐一个视频【音视频】FFmpeg音视频入门到精通+实战课_哔哩哔哩_bilibili
同时推荐一个好用的视频下载工具(支持bilibili视频下载)KurtBestor/Hitomi-Downloader: Desktop utility to download images/videos/music/text from various websites, and more.
下图是最终写出来的界面(一共就俩界面文件,一个是displayVideo播放视频窗口,一个是videocontrolbar的视频控制栏(详细代码查看my_learnt/DisplayVideo at main · haoyouxiaoju/my_learnt)
- 如果有其他不懂的地方可以私信我,看到的话会回复

其中controlbar简单的使用designer拖拽出来!

这里只写一些注意事项:
我使用的是qt6.8 同时项目也是cmake项目
- 在使用qrc管理资源时,你可能会发现QFile没法找到qrc管理的文件这时候你得在cmakeLists.txt中查看
# 启用 Qt 资源支持
set(CMAKE_AUTORCC ON) # 必须开启(否则qrc文件无法参与编译)
- QVideoWidget是一个特殊的渲染widget,需要设置一下鼠标穿透
setAttribute(Qt::WA_TransparentForMouseEvents, true);
- 同时使用过程中发现视频开头会黑屏
//写这个的原因是以为视频开头会黑屏,如果直接设置player的position为0不能解决
//通过尝试,设置105刚刚好
//可能跟视频的关键帧有关吧
QTimer* timer = new QTimer;
connect(timer, &QTimer::timeout, [=]() {
qDebug() << "Media status:" << player->mediaStatus();
qDebug() << "是否支持seek:" << player->isSeekable(); // 此时再检查
if (player->isSeekable() == true) {
player->setPosition(105);
qDebug() << "durantion" << player->duration();
timer->stop();
timer->deleteLater();
}
});
timer->start(1000); // 每 100ms 检查一次
- 这里的话是因为v_widget和controlBar没有挂靠在DisplayVideo,是popup所以在移动和resize DisplayVideo的时候要重新设置v_widget和controlBar,提示一下如果构造函数中new出来的widget没有挂靠在其他widget的话记得在析构函数中delete
void DisplayVideo::resizeEvent(QResizeEvent * event)
{
QWidget::resizeEvent(event);
v_widget->resize(event->size());
bar->resize(QSize(event->size().width(), bar->height()));
QPoint point = v_widget->mapToGlobal(QPoint(0, 0));
bar->move(point.x(), point.y() + v_widget->height() - bar->height());
}
void DisplayVideo::moveEvent(QMoveEvent* event)
{
QWidget::moveEvent(event);
//if (bar->isVisible()) {
bar->move(event->pos().x(), event->pos().y() + v_widget->height() - bar->height());
//}
}
- 设置视频播放速度使用QCombobox,在点击combobox时出现异常,controlbar会hide所以添加了事件过滤
// controlBar的构造函数添加
ui.comboBox->installEventFilter(this);
bool VideoControlBar::eventFilter(QObject* obj, QEvent* event)
{
if (obj == ui.comboBox && event->type() == QEvent::MouseButtonPress) {
QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
if (mouseEvent->button() == Qt::LeftButton) {
// 阻止事件继续传播
event->accept();
ui.comboBox->showPopup();
return true;
}
}
return QWidget::eventFilter(obj, event);
}
- 我现在还没找到解决方法一个问题就是设置background-color:rgba没有效果,如果你知道怎么解决,请告诉我

QMediaPlayer+QVideoWidget+QAudioOutput实现一个简单视频播放器-Qt6.8的更多相关文章
- 手把手从零开始---封装一个vue视频播放器组件
现在,在网页上播放视频已经越来越流行,但是网上的资料鱼龙混杂,很难找到自己想要的,今天小编就自己的亲身开发体验,手把手从零开始---封装一个vue视频播放器组件. 作为一个老道的前端搬砖师,怎么可能会 ...
- 使用VideoView实现简单视频播放器
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/39471397 VideoView内部封装好了Mediaplayer.Android框架 ...
- 使用网络TCP搭建一个简单文件下载器
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 目录 一丶项目介绍 二丶服务器Server 三丶测试TCP server服务器 四丶客户端Client 五丶测试客户端向服务器下载 ...
- MyDebugeer 一个简单调试器的实现
学习的是网上的帖子,所以就不贴源码了. 整个程序以调试循环为主体,实现了启动调试,继续执行,内存查看,读取寄存器值,显示源代码,断点的设置.查看.删除,三种单步执行:StepIn.StepOver.S ...
- 一个html5视频播放器
具有播放视频,拖拽,自定义右键菜单,上传头像的功能 <!DOCTYPE html><html lang="en"> <head> <met ...
- 一个3D视频播放器的演示APK
介绍: 这个APK是把视频显示分割成左右对等的两幅画面.同时无缝显示在屏幕上, 配合类似谷歌的cartdboard "纸片壳" 或市面上的魔镜等3D眼镜来播放视频画面, 根据3D眼 ...
- Opencv 简单视频播放器
// C++ header and namespace #include <iostream> #include <string> #include <cstdlib&g ...
- 【转】100行代码实现最简单的基于FFMPEG+SDL的视频播放器
FFMPEG工程浩大,可以参考的书籍又不是很多,因此很多刚学习FFMPEG的人常常感觉到无从下手.我刚接触FFMPEG的时候也感觉不知从何学起. 因此我把自己做项目过程中实现的一个非常简单的视频播放器 ...
- 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)【转】
转自:http://blog.csdn.net/leixiaohua1020/article/details/8652605 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] ...
- 实现了一个简单的cage变形器
今天实现了一个简单变形器,可以用一个网格的形状影响另一个网格的形状. 如图,蓝色网格的形状被灰色网格操控. 当前的算法非常简单,就是计算蓝色网格每个点到灰色网格每个点的距离,以距离x次方的倒数作为权重 ...
随机推荐
- Netty基础—1.网络编程基础一
大纲 1.什么是OSI开放系统互连 2.OSI七层模型各层的作用 3.TCP/IP协议的简介 4.TCP和UDP的简介 5.TCP连接的三次握手 6.TCP连接的四次挥手 7.TCP/IP中的数据包 ...
- 基于Element的el-input实现一个可以显示千分位符的金额输入框
直接上代码 1 <template> 2 <!-- 定义一个 Element UI 的输入框组件 --> 3 <el-input 4 v-model="form ...
- 当你在浏览器中输入 google.com 后按下回车发生了什么?
按下"g"键 接下来的内容介绍了物理键盘和系统中断的工作原理,但是有一部分内容却没有涉及.当你按下"g"键,浏览器接收到这个消息之后,会触发自动完成机制.浏览器 ...
- HTTP 和 RPC
TCP 是传输层的协议,而基于 TCP 造出来的 HTTP 和各类 RPC 协议,它们都只是定义了不同消息格式的应用层协议而已. RPC(Remote Procedure Call),又叫做远程过程调 ...
- linux 根目录与分区
1.2 根目录的建立 大家一般都会知道根目录的产生方式,就是系统使用mount指令,将系统所在的分区挂载到[/]目录中,这样便完成了所谓的根目录.但你是否想过, 虽然看起来合理却有点诡异,因为根目录 ...
- 【Python】import模块和包
模块和包 一. 模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块能定义函数,类和变量,模块里也能包含可执 ...
- ORA-28001:口令已经失效
Oracle用户口令默认的有效期导致的一个异常,留爪. Oralce11G下,创建的用户及口令,也就是用户密码默认会有个180天的过期时间, 如果超过180天用户口令未做修改,则该用户口令失效,也就是 ...
- BotSharp 5.0 MCP:迈向更开放的AI Agent框架
一.引言 在人工智能快速发展的时代,AI Agent(人工智能代理)作为一种能够自主感知环境.决策并执行动作的实体,在众多领域展现出了巨大的潜力.BotSharp 是一个功能强大的开源项目,由 Sci ...
- tomcat-shell脚本
自动部署项目脚本参考: #!/bin/bash#自动部署脚本source /etc/profileexport LANG=zh_CN.UTF-8#tomcat路径tomcatBinPath=/usr/ ...
- EFCore(五)——多个DBContext的Code First指定对应的DBContext更新
此环境为ASP.NET Core的项目 1.在需要更新的DBContext里添加空的构造函数 2.打开Nuget命令行选择对应的目录位置 3.带参数-Context指定对应的DBContext 1. ...