软工课设要求做一个播放器,于是就四个同学组队一起做了一下。四个人里三个在实习,都不好见面哈哈。虽然做的很糟糕,但是好歹是做出来了,是个平均水平的样子。我主要负责的后端AVKernel部分设计和开发。设计和实现的挺烂的,是x山。多人合作后大家改来改去就变的更烂了,更没法看了,软工课设充分体现了我们软工能力的不足。
1 编写目的1. 掌握软件工程的基础知识和理论
2. 掌握软件项目管理和团队开发的工作方法
(小声:真实目的是为了交作业)
2. 需求音视频播放支持播放主流的mp4、flv等格式的视频,视频播放帧率不低于30支持播放主流的mp3等松下按摩椅格式的音频,支持从音频文件中提取出专辑封面文件作为预览图(部分音频资源具备)支持全屏播放音视频播放控制提供一个音量控制滑杆,用于控制播放音量提供一个播放进度滑杆,用于展示当前播放进度提供上一首、下一首、播放or暂停按钮,用于控制播放提供一个切换播放模式的控制按钮,支持只播放当前、顺序播放、随机播放、单个循环播放提供一个全屏or小屏播放切换按钮,全屏播放时,鼠标移动需要在视频上面展示音视频播放控制小控件,超过5s鼠标不动小控件自动隐藏支持快捷键草稿空格键 播放或暂停Ctrl+F 全屏或小屏Ctrl+I 唤起资源导入弹窗Ctrl+⬅️ 上一首Ctrl+➡️ 下一首Ctrl+⬆️ 增加音量Ctrl+⬇️ 降低音量媒体库支持一个媒体库播放列表,支持拖拽或者点击导入按钮armani手表怎么样进行导入音视频文件播放到媒体库中的对应视频需要有高亮或者选中态等提示媒体库列表支持本地缓存,下次启动时需要恢复上一次的列表。存在资源被移动等情况需要有对应的丢失态提示程序安装包支持将整个程序打包成一个安装包程序,安装后在桌面创建一个快捷方式,达到在任意电脑上都能安装和使用
杂项功能支持查看媒体信息,包括:文件名视频码率、帧率、编码格式、分辨率等等音频码率、编码格式、声道数、专辑信息、演唱者信息等等支持进度微调下一帧、上一帧快捷键操作下5帧、上5帧快捷键操作支持倍速播放支持2倍、4倍、8倍的倍速播放进度条支持预览对应位置的视频缩略图鼠标停留在进度条的任意位置,展示对应时间点的视频帧缩略图支持视频倒放支持视频倒放,倍速倒放支持展示音频波形图音频播放过程,支持展示波形变化图质量要求具备基本的功能良好的UI视觉、交互设计播放不卡顿功能主路径无闪退3 概要设计整体采用Qt6.2,SDL,ffmpeg, C++17标准,CMake开发(2022-6-8)。
播放器项目由两个子项目组成:前端QtFrontEnd项目,后端AVKernel项目。(以及安装)
QtFron水晶头颅tEnd: 主要处理UI,用户事件处理,前端状态和数据维护,采天天嫖娼脸皮厚用MVVM模式。
AVKernel: 主要负责定制的音视频基本能力,适当采用了几种设计模式。
整体大致如下图:(图示内核部分并不是最新的,经过较多迭代和较大变化,所以图示并不完整,大致样子是正确的不过)
以下分别介绍两个子项目。
QtFrontEndQtFrontEnd工程通过消息总线以及Api调用与AVKernel工程进行双向通信。
QtFrontEnd设计时以窗口为单位组织分别设计,每个窗口是一个View。所有View由一个Controller类控制,Controller类通过StatusManager维护状态和数据。(我做的AVKernel,没做QtFrontEnd,以上只是我的个人理解)
QtFrontEnd在曲库和视频库的维护上是MVVM模型
AVKernel接下来介绍AVKernel部分的设计
如图可见,AVKernel有三个主要部分与三个次要部分组成。
三个主要部分是AVCore, AVThread, 华夏保险怎么样AVPlayer
三个次要部分是Log,Common,Test
首先介绍三个主要部分(AVKernel中实时倒放不是我做的,我了解不多,所以介绍可能不全面)
主要部分概述:
AVCore : 封装ffmepg,音视频处理与播放的核心类。AVThread : 描述音视频播放流程的类。继承自ThreadEventLoop,也负责底层的事件响应和各自阶段的状态维护。模板模式 + 事件循环 + 消息总线
AVPla海贼王大乱斗yer : 一个提供基本播放能力的对象。控制播放的各个流程和其他资源,以提供基本播放能力,向外界提供部分API
主要部分详情:
AVCore: (倒放不龙樱文是我开发的,不熟悉,所以以下没有写)AVCore.h(对外接口头文件)Demuxer(解复用,低精度seek,音视频信息提取,时间基转换)Decoder(音频或者视频软解码,高精度seek)Packet(AVPacket的封装)Frame(AVFrame的封装)Resample(对音频进行重采样倍速,归一化音频格式,得到S16不定声道数的PCM数据)Converter(调整视频帧分辨率,归一化视频格式,得到YUV420P格式不定分辨率视频帧)AudioRenderBase(音频播放器接口类,约定音频播放接口)QtAudioRender(音频播放实现类,封装了Qt音视频设备相关处理,提供音频播放器状态控制,必要播放信息接口,不定声道数支持在线粘度计,软件音量调节)VideoeswcRenderBase(视频播放器接口类,约定视频播放接口)SDLVideoRender(视频播放实现类,封装了SDL视频播放相关操作,在指定窗口handle播放,支持随意改变窗口大小)AudioVideoSynchronizer(音视频同步类,维护音视频同步信息以及丢帧或者延迟的同步逻辑)QtVideoRender(已经废弃的视频播放实现类,使用QImage。已被SDLVideoRe交响乐之雨nder取代)AVThread:AVThread.h(对外接口头文件)Common.h (所有AVThread公用定义和头文件)ThreadEventLoop (所有AVThread的基类,简单的音视频处理阶段的状态控制框架)DemuxThread(解复用线程,解复用阶段的处理逻辑)DecodeThread(解码线程,有两个对象,分别负责音频软解码与视频软解码)AudioRenderThrea王洪文照片d(音频播放线程)VideoRenderThread(视频播放线程)AVPlayer:AVPlayer(控制各个AVThread和其他相关资源,对外提供音视频相关的基础能力)接下来介绍三个次要部分Log,Common,Test
次要部分概述:
Log(一个用于内核测试开发的简易日志库,支持日志级别,日志输出位置,日陈宝莲养小鬼志颜色,多种日志模式,耗时统计工具等等)Common(内核部分的可复用组件,例如动态管线,并发队列包装器,消息总线,无锁队列)Test(内核部分的各个测试程序)AVKernel部分原有autogen脚本升级为整个项目的autogen脚本,所有AVKernel就删除了自己的autogen。
次要部分详情:国际歌词
Log部分:支持日志级别,日志输出位置,日志颜色,多种日志模开网吧式,耗时统计工具等等
例如:
#ifdef DEBUG#define ONTESTLOGTIPS RESETCOLO怀孕后能同房吗R CYANCOLOR "ONTEST: [%s:%d->%s] " RESETCOLOR#define LOGONTEST(format, ...) \ fprintf(LOG_OUTPUT, ONTESTLOGTIPS format "\n", __FILE__, __LINE__, __func__, \ ##__VA_ARGS__);#define LOGONTEST_IF(expr, format, ...) \ if (expr) { \ fprintf(LOG_OUTPUT, ERRORLOGTIPS format 股份支付4;\t with " STR(expr) " is true\n", \ 免费网络推广 __FILE__, __LINE__, __func__, ##__VA_ARGS__); \ }#else#define ONTESTLOGTIPS ""#define LOGONTEST(format, ...) ((void)0)#define LOGONTEST_IF(expr, format, ...) ((void)0)#endif2. Common:
消息总线后期迁移到项目的Common下,为整个项目提供消息通知能力。
Common下有很多,但是有不少都写了没用(捂脸)。就用了消息总线,并发队列包装器
3. Test就是Test没什么可以介绍的。
1.3 业务流程图
1.3.1 QtFrontEnd业务流程
队友做的,不是很清楚
1.3.2 AVKernel业务流程
AVKernel不好用业务流程表达,只简单概述介绍部分。
解复用:解码流程See超级搞笑的笑话k流程实时倒放流程倒放是队友做的,不太清楚。我当时只参与了设计。
大致流程是seek一小段,翻转。然后不断重复。
视频有两个层次的翻转,packet翻转,frame翻转
音频有三个层次的翻转,packe绅士击击剑t翻转,frame翻转,sample翻转
倒放时也需要调整原有的音视频同步逻辑。
其他流程系统总体结构设计如图所示
4. 超烂的项目源代码企业法务千万不要相信README.md,那已经n久没更新了。
本文发布于:2023-06-01 23:46:27,感谢您对本站的认可!
本文链接:http://www.ranqi119.com/ge/85/182902.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |