UML设计模式 ffmpeg opengl opensl 封装
- 接口实现:接口C++纯虚函数,不需要实现,由它的继承者来实现(泛化实现)
- 父类当中并不一定有纯虚函数,但必须有虚函数,只是对它进行泛化(重载),没有虚函数,重载之后,父类的指针,访问方法时就访问不了子类的方法。
- 画类图时,要减少依赖,当然不能为减少依赖而增加继承和实现(最弱的,头文件“.h”当中都不相关,可能只在某一个代码里调用了“.cpp”可以随时容易切除与替换“如:换一个日志库”)
- 关联:这两个作为成员,作为函数的参数或返回值,又分2种特殊情况:组合,聚合
- 组合:播放器包含的模块:解封装,解码,音频重采样,音视频播放器显示(不可脱离,否则没意义)
- 聚合:模块可剥离独立,如:数组。
一定要先画类图,否则关系耦合越来越大,这样才可以直观的看,有些线(关联关系)是可以砍掉的,降低了维护成本。
模块
- IDemux 解封装,复制把文件(mp4,flv)解封装出来,读取一帧帧数据,包括支持打开流媒体(Rtmp,Rtsp流媒体数据源)
- IDecode 解码,把音频解码成最终的实际数据和视频压缩的h264解码成yuv的数据,性能的主要开销,软解码(包含多线程解码),硬解码
- IResample 针对音频的重采样,视频也有重采样,是把yuv转成RGB
- IVideoView 显示,解码出来之后,进行显示yuv的数据(用openGLES)
- IAudioPlay
项目用到的设计模式
- Adapter适配器模式:封装ffmpeg、opengl、opensl
- Builder构建者模式:构建播放器对象
- Proxy代理模式:管理播放器创建和线程安全
- Facade外观(门面)模式:播放器管理解封装、解码、重采样、显示、音频播放
- Singleton单件模式:唯一的构建者对象
- 生产者消费者模式:解封装生产数据包,解码模块消费解码
- Observer观察者模式:模块间通信
解码一个视频 ->特效的Observer->OpenglES