2 02_视频播放器项目实战
目录
2.1 01_功能
2.1.1 01_介绍
功能。
在视频播放器界面中, 主体是一个视频输出画面, 底部左侧有几个控制按钮, 中间是当前播放进度和视频总时长, 右侧是可拖动的滑块。 拖动滑块时视频播放器将调整播放进度。
2.2 02_设计
2.2.1 01_介绍
设计。
视频播放器软件界面没有使用QT界面设计器, 而是使用C++代码创建所有界面控件。 使用开源音视频软件命令行工具ffmpeg获取视频总时长。 使用QT框架的多媒体模块Multimedia、 多媒体界面模块MultimediaWidgets。
2.3 03_实现
2.3.1 01_窗口定义
窗口定义。
在窗口类型MainWindow中, 定义了按钮ID的枚举类型。 定义了一些槽函数, 用于处理一些信号, 按钮点击、 视频回放状态发生变化、 媒体状态变化、 播放进度变化、 滑块按下了、 滑块释放了。 还定义了一些控件类型的变量, player:视频播放器。 videoWidget:视频输出窗口。 buttonPlay:播放按钮。 buttonPause:暂停按钮。 buttonStop:停止按钮。 labelProgress:进度标签。 slider:滑块。 duration:总时长信息。 group:按钮分组。 sliderDragging: 滑块是否正被拖动。 playerPausedBySlider: 播放器是否因为拖动滑块而暂停播放了。
2.3.2 02_辅助函数
辅助函数。
获取视频的总时长函数 get_duration_of_mp4。 通过运行音视频开源软件 命令行工具ffmpeg 并读取和分析输出信息来获取总时长。
2.3.3 03_构造函数
构造函数。
在构造函数中, 首先创建了主布局QVBoxLayout。 随后创建了视频输出窗口QVideoWidget, 并加入到主布局中。 然后创建了底部水平布局QHBoxLayout。 接着创建了按钮分组QButtonGroup。 然后创建了几个按钮, 并加入到按钮分组中。 接着创建了进度标签。 然后创建了滑块控件。 这些控件都加入到水平布局中。 接着将水平布局加入到主布局中。 随后创建了一个QWidget窗口, 布局设定为主布局, 并将这个窗口作为中心窗口。 随后创建了视频播放器对象。 设定音频输出为QAudioOutput。 设定视频输出为QVidieoWidget。 最后还建立了信号和槽的连接。
2.3.4 04_加载视频
加载视频。
Duration类型 用于表示音视频的时长。 load函数首先了加载视频的功能。 首先调用函数 get_duration_of_mp4 获取视频总时长。 在标签控件中显示视频总时长。 调用player的setSource函数 设定视频URL, 调用play函数播放视频。
2.3.5 05_播放处理
播放处理。
播放控制按钮槽函数 controlButtonClicked。 如果点击了播放按钮, 而且播放状态不是正在播放状态, 则调用play函数进行播放。 如果点击了暂停按钮, 而且播放状态是正在播放状态, 则调用pause按钮暂停播放。 如果点击了停止按钮, 而且播放状态不是已停止播放, 则调用stop按钮停止播放。
2.3.6 06_进度处理
进度处理。
播放进度变化处理槽函数 positionChanged。 根据播放进度计算时长信息。 然后在标签控件上更新当前进度和总时长信息。 计算播放进度百分比, 据此修改滑块控件的位置。 滑块按下处理槽函数 sliderPressed。 设定sliderDragging标记为true, 表示滑块已被按下。 为了滑块拖动过程中滑块 不受播放进度变化的影响, 如果是正在播放状态, 则暂停播放, 并设定playerPausedBySlider标记为true, 表示播放器已经因为滑块拖动而暂停播放了。 滑块释放处理槽函数 sliderReleased。 根据滑块位置计算播放进度, 然后调用setPosition函数修改播放器的播放进度。 将滑块拖动标记设定为false。 如果playerPausedBySlider标记为true, 播放器在拖动过程中暂停播放了, 则恢复播放, 同时恢复该标记为false。