前言
好久未更新
之前的几篇文章介绍了音视频相关概念,FFmpeg的交叉编译,FFmpeg Api解封转 解码 音频重采样和视频播放相关的功能,以及分别介绍了OpenGLES Shader播放视频和 OpenSLES播放音频的实现,今天的文章将对这些功能进行整合,实现一款播放器的完整功能,包括播放,暂停,快进快退这些通用的实现。主要介绍封装思想,不注重代码细节,具体可查看源码。
项目源码
结构
我们使用FFmpeg实现播放的整个过程,从打开视频文件,解封装,解码,音频重采样,帧像素格式转换,播放音频,播放视频,这一系列的过程其实可以看做视频播放的一个通用的逻辑,每一个播放器,从打开一个视频,到画面开始显示,声音开始播放,几乎都要经历这么一个过程。所以项目将会被分为好几个模块----解封装,解码,音频播放,视频播放,为了使架构具有更强的扩展性,每一个功能模块我们都将其抽取出一个基类,在c++中用纯虚函数来提供通用的接口,具体的实现交给派生类处理,比如解封装这个模块,IDemux基类中抽取出了open接口,每个IDemux派生类都要来实现这个接口,因为针对一个视频进行解封装,open是必须的,然后具体如何open一个输入的视频文件,交给子类去实现,以FFmpeg的方式实现解封装,创建FFDexmu,他有自己解封装的逻辑,但是如果有一天我们不用FFmpeg进行解封张的操作了,那么只需要创建另一个XXDemux继承IDemux实现open接口就可以了。
项目类图如下
未完。。待续,,,