VLC 采用的是全模块化结构,在系统内部,动态载入所需的模块,放入一个module_bank的结构体进行统一管理,连VLC的Main模块也是经过插件的方 式动态载入的(经过module_InitBank函数在初始化创建module_bank时)。对于不支持动态载入插件的系统环境中,VLC也能够采用 builtin的方式,在VLC启动的时候静态载入所须要的插件,并放入module_bank统一管理。服务器
VLC 的模块分红不少类别主要有:access、access_filter、access_output、audio_filter、 audio_mixer、audio_output、codec、control、demux、gui、misc、mux、packetizer、 stream_output、video_filter、video_output、interface、input、playlist等(其中黑体为核 心模块)。VLC不管是做为流媒体服务器仍是多媒体播放器,它的实质思路就是一个“播放器”,之因此这么形象描述,是由于它实质处理的是ES、PES、PS、TS等流间的转换、传输与显示。对于流媒体服务器,若是从文件做为输入 即:PS->DEMUX->ES->MUX->TS;对于多媒体播放器若是采用UDP方式传输 即:TS->DEMUX->ES。网络
这里我简单的从流程,关键模块及其核心库libvlc进行说明我本身的理解。ide
1. 主要流程模块化
1). 读取源数据;2)解封装; 3)解码;4) 渲染;函数
流程图描述以下所示:ui
2. 关键模块spa
1). Input Modules : 用于数据流(本地或者网络文件或者流)的读入;解封装,输出原始流ES(用于后续的解码操做);读取buffer中的数据进行交互;插件
2). Audio Modules:视频输出视频渲染,输出和窗口管理;多路复用模块用于格式封装,封装过程不涉及编解码过程;线程
3). Video Modules:视频输出视频渲染,输出和窗口管理;多路复用模块用于格式封装,封装过程不涉及编解码过程;code
4). Stream Modules:音视频文件的解码操做;将解码后的数据流送入FIFO,进行渲染。
5). UI Modules:用户用户和vlc各module之间的交互线程管理
3. libvlc
vlc核心的是libvlc,它提供界面,应用处理功能,全部的libvlc的源代码都放在src目录及其子目录,其结构以下所示:
今天的总结就到这里了,欢迎你们多多点评指导啊。