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进行说明我自己的理解。
1. 主要流程
1). 读取源数据;2)解封装; 3)解码;4) 渲染;
流程图描述如下所示:
2. 关键模块
1). Input Modules : 用于数据流(本地或者网络文件或者流)的读入;解封装,输出原始流ES(用于后续的解码操作);读取buffer中的数据进行交互;
2). Audio Modules:视频输出视频渲染,输出和窗口管理;多路复用模块用于格式封装,封装过程不涉及编解码过程;
3). Video Modules:视频输出视频渲染,输出和窗口管理;多路复用模块用于格式封装,封装过程不涉及编解码过程;
4). Stream Modules:音视频文件的解码操作;将解码后的数据流送入FIFO,进行渲染。
5). UI Modules:用户用户和vlc各module之间的交互线程管理
3. libvlc
vlc核心的是libvlc,它提供界面,应用处理功能,所有的libvlc的源代码都放在src目录及其子目录,其结构如下所示:
今天的总结就到这里了,欢迎大家多多点评指导啊。