0x00 前置信息 VLC是一个非常庞大的工程,我从它的架构及流程入手进行分析,涉及到一些很细的概念先搁置一边,日后详细分析。 0x01 源码结构(Android Java相关的暂未分析) # build-android-arm-linux-androideabi/:第三方库。
# modules/:模块代码。
# modules/demux: 解复用模块代码。
# modules/codec: 解码模块相关代码。
# modules/access: 访问模块相关代码。
# 其他:未详细分析。
# src/: VLC架构核心代码。
# src/config/: 从命令行和配置文件加载配置,提供功能模块的读取和写入配置。
# src/control/: 提供动作控制功能,如播放/暂停,音量管理,全屏,日志等。
# src/extras/: 平台特殊性相关代码。
# src/modules/: 模块管理。
# src/network/: 提供网络接口。
# src/posix/: 多线程相关。
# src/osd/: 显示屏幕上的操作。
# src/interface/ : 提供代码中可以调用的接口中,如按键后硬件作出反应。
# src/playlist/: 管理播放功能,如停止,播放,下一首,随机播放等。
# src/text/: 字符集。
# src/input/: 输入流相关代码。
# src/video_output/ : 初始化视频播放器,把从解码器获得的数据处理后播放。
# src/audio_output/ : 初始化音频混合器,把从解码器获得的数据处理后播放。
# src/stream_output/: 输出音频流和视频流到网络。
# src/test/: libvlc测试模块。
# src/misc/: libvlc使用的其他部分功能,如线程系统,消息队列,CPU的检测,对象查找系统,或平台的特定代码。
# 其他:未详细分析。
0x02 基础概念 对于一个视频的播放,播放器的执行步骤大致如下:
- 读取原始数据
- 解复用
- 解码
- 显示
VLC在包含以上概念的基础上,又抽象出几个其他概念,先列出VLC中抽象出来的重要概念:
- playlist: playlist表示播放列表,VLC在启动后,即创建一个playlist thread,用户输入后,动态创建input。
- input: input表示输入,当用户通过界面输入一个文件或者流地址时,input thread 被动态创建,该线程的生命周期直到本次播放结束。
- access: access表示访问,是VLC抽象的一个层,该层向下直接使用文件或网络IO接口,向上为stream层服务,提供IO接口。
- stream: stream表示流,是VLC抽象的一个层,该层向下直接使用access层提供的IO接口,向上为demux层服务,提供IO接口。
- demux: demux表示解复用,是视频技术中的概念,该层向下直接使用stream层提供的IO接口,数据出来后送es_out。
- es_out: es_out表示输出,是VLC抽象的一个层,该层获取demux后的数据,送decode解码。
- decode: decode表示解码,是视频技术中的概念,获取es_out出来的数据(通过一个fifo交互),解码后送output。
- output: output表示输出,获取从decode出来的数据,送readerer。
- readerer: readerer表示显示,获取从output出来的数据(通过一个fifo交互),然后显示。
下图显示了这些抽象的概念的关系,其中蓝色表示VLC抽象的概念。 |