kizumi_header_banner_img

Learn. Build. Share.

加载中

文章导读

基于脚手架微服务的视频点播系统-播放控制部分


avatar
xiu114514 2025年9月10日 35
基于脚手架微服务的视频点播系统-播放控制部分

@TOC 项目源码链接: https://gitee.com/ly121381/cpp-videoplayer 因为代码量已经比较大了,所以这里我们先提交一部分,可以给读者一个参考。从此文章开始项目每更新一篇文章我都会在文章结束之后合并一次分支并提交代码。 界面布局部分已经基本完成,那么接下来就是让我们的客户端能够播放视频。首先我们先改一下原来的播放窗口,将之前的playerPage.cpp中的initPlayer部分的下列代码:

改为:

也就是说拿掉它的边框,同时我们重写其鼠标点击与拖动函数,让我们的窗口支持拖拽移动:

dragPos是新增的私有成员QPoint类型的成员变量。 接下来在ui界面进行布局,将原来的playControlBox与playHead从screen中拖出来将二者置于screen的下上方。修改后的控件嵌套关系如下: 在这里插入图片描述 在这里插入图片描述

还记得我们之前有隐藏动画吗,这部分我们不要了,将隐藏动画的所有相关语句删除,然后在之前我们给动画设置的定时器的timeOut的槽函数修改为如下内容:

也就是说当定时器时间到了之后直接将二者隐藏以尽可能的让screen占多的空间当用户不进行任何操作时。明明原来的效果更好,为什么要这样改,等到下面我们再来解释。 我们先来看一下本文结束时最终的播放器效果: 在这里插入图片描述 图中带有头像的是我们自己发的弹幕。下面正式开始本文的内容。

一.mpv库的封装

我们之前做音乐播放器的时候,其实有一个严重的问题没有解决,因为qt的音视频播放是基于系统自身自带的播放器进行解码播放的,就会导致部分类型文件无法播放,比如流式播放中常见的m3u8文件。不了解m3u8文件格式的读者可以去搜一下就知道为什么我们之后要用这种格式的文件进行视频播放了。 那么这时我们最好是不用qt自带的媒体播放类,而是借助mpv来实现我们的播放器。首先我们需要将mpv官方提供的头文件与动态库文件下载到我们的工程目录底下(这组文件可以到我提交的源码中获取): 在这里插入图片描述 在这里插入图片描述 然后再我们的项目中添加新文件,除了上图中的dll其他文件全部添加到工程中(当然除了mpvplayer.cpp与mpvplayer.h-这是我们后面自己简单对mpv进行了封装的类文件)。 接下来在CMakeLists.txt中添加如下代码:

最后将上图dll文件夹下的libmpv-2.dll拷⻉到exe所在⽬录下那么我们的mpv环境配置就结束了。 大家可以去mpv的官网: https://mpv.io/ 它下面有github源码的链接,大家可以看一下人家官方给的mpv在qt中使用的示例,看个七七八八就ok了,我们这里只是简单的使用,接下来我们新添加一个普通类在mpv文件夹下,类名为MpvPlayer,下面是对mpv库的简单封装:

这部分其实大家可以直接照抄就行,可以看看或搜索下去理解这部分封装中的某些点。注意我们只是简单使用,了解即可。

二.实现播放器中的各项功能

其实有了我们之前做音乐播放器的经验,再加上上面对mpv库的封装,实现播放器的各项功能其实就很简单了。我们这里就不再详细的介绍什么地方需要添加什么了,主要说明几个需要注意的地方,其余详情可以参考我提交的源码:

2.1close导致的mpv对象释放问题

还记得我们之前给关闭按钮绑定了close槽函数了吗,当qt的窗口被close之后,qt会将当前窗口的句柄归还给操作系统,此时mpv_handle对象感知到原来的渲染窗口句柄丢失了,就会触发MPV_EVENT_SHUTDOWN事件,而我们重新打开窗口时因为mpv对象被释放了,所以我们再掉startPlayer方法就会引起空指针的解引用导致程序崩溃,而解决办法就是让其窗口在关闭时不要去close,而是使用hide。

2.2弹幕框跟随问题

因为我们的弹幕框是一个透明的QFrame,当窗口位置移动时你的弹幕框自然需要跟随我的播放窗口。但是如果全屏的时候,他就没办法去通过鼠标拖拽事件去跟随了,所以我们需要自己去在最大化函数中改变它的位置,当然还需要去改变它的宽度:

2.3弹幕移动的问题

我们这里给三个弹幕框,然后让每个弹幕只能在当前窗口中停留10s。所以就可以这样去设计所有弹幕的移动逻辑:

2.4弹幕运动与暂停跟随视频的播放暂停

因为我们在初始化弹幕项的时候将他们分别挂到了不同轨道的对象树上,所以我们可以通过findChildren去找到他们并且控制他们的运动,暂停与释放:

2.5弹幕关闭时不允许发射弹幕

总之,因为播放器功能实现这部分比较简单,所以我们就不详细每一处实现方法了。



评论(已关闭)

评论已关闭

日历

2025 年 9 月
 1
2345678
9101112131415
16171819202122
23242526272829
3031