以前看过VLC的代码,学习过VLC相关的知识,现将其记下来以作备忘
注:本记录是以VLC2.0作为参考,如有出入,请先核对版本号
一、简介
VLC多媒体播放器(最初命名为VideoLAN客户端)是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影音光盘及各类流式协议。它也能作为unicast或 multicast的流式服务器在IPv4或 IPv6的高速网络连接下使用。它融合了FFmpeg项目的解码器与libdvdcss程序库,使其有播放多媒
体文件及加密DVD影碟的功能。
二、特性
简单、快速、强大的媒体播放器。
可播放任何介质:文件、光盘、摄像头、设备及流媒体。
可播放大多数格式,而无需安装编解码器包,其内已经包含MPEG-2, DivX, H.264, MKV, WebM, WMV, MP3… 等诸多library。
可在所有平台运行: Windows, Linux, Mac OS X, Unix…
完全免费,无间谍软件,无广告,无跟踪用户的行为。
可对媒体进行转换与串流。
详细Features见:
http://www.videolan.org/vlc/features.html
三、架构
3.1 整体框架
libVLCcore: libvlc的核心,抽象出了一个libvlc_instance_t 对象。modules的装载/
卸载机制。还有一套多媒体相关的操作接口。如:input, multiplexing,
demultiplexing, audio output, video output.Modules: modules提供了具体的功能。根据编译配置module数量200-400之间。
根据功能可分类为:输入输出(文件、网络、cd)、编解码(mp3,h254)、
模块化的GUI(基于qt、mac)External libraries: 开源软件都秉承着不要重复造轮子的思想。所以vlc本身也依赖了大
量外部开源库,如知名的ffmpeg、qt、live555等。VLC main: player的main。初始化libVLC并加载用户界面,注意vlc的用户界面也是
以module的形式存在。基于libvlc我们就能自己开发自己的播放器了。
3.2 分层框架结构
3.3 modules 按照功能大致分类
3.4 源代码目录结构
3.5 模块关系
这里主要是关于模块的关系,控制接口以及线程再整个框架中的分布情况(即哪些地方使用到了线程)
上图标有红色圆圈的模块就表示其中有使用到线程
3.6 抽象结构
以下,是我按照对VLC的理解抽象出的VLC的结构图
上图中,每一个虚线框起来的,都可以认定为是一个较大的模组(由多个模块组成)
四、运行流程
ELF (Linux下可执行文件的格式) 先被动态加载,然后主线程就变成了接口线程并且在src/interface/interface.c中开始。它执行下列步骤:
- cpu探测:什么型号?所有能力(MMX,MMXEXT,3DNow,AltiVec等等)
- 消息接口初始化;
- 命令行选项解析组件
- 创建播放列表
- 仓库初始化
- 加载所有内置和动态组件
- 打开接口
- 安装信号处理器:SIGHUP,SIGINT和SIGQUIT(捕获一个,忽略后来的并退出)。
- 派生音频输出线程;
- 派生视频输出线程;
- 主循环:事件管理;
下图为具体的流程图