VLC虽然是用c代码实现的,但是在代码编写上遵循了面向对象原则,易修改和扩展。不过实话实说,结构之间的关联太过于频繁,理解上还是不太容易。如果能够改成c++那是最好不过了。
对于媒体播放器,肯定离不开解复用,解码,音频和视频输出这四个模块,不管是DirectShow,还是VLC,或者自己要开发一个播放器,都是如此。媒体播放器的差异主要存在于模块之间的通信方式,界面消息处理上。DirectShow使用Filter形成Graph形式,可以自由搭建想要的数据处理流程,能够实现定制自己要求的播放器,但是系统占用资源较多,实时性能上要差一些;VLC结构上更为紧凑,不能够自由组合想要的处理流程,但是实时效率更高,系统占用率上更低。
本文简要描述了播放引擎架构,给大家对VLC播放过程的一个大致印象。如图1所示。主要有以下活动线程,解复用线程,音频和视频解码线程,视频处理线程,音频和视频播放线程。
1)解复用线程:实现对音频和视频的分离,将压缩包送入相应的解码线程。另外在VLC中,解复用线程空闲时候用于处理播放控制消息,这个做的比较巧妙,但是当视频数据较大时候,比如播放高清素材时候,可能响应界面就不太及时了。
2)解码线程:音频和视频线程分别调用相应的解码器完成数据解码。
3)视频处理线程:完成视频画面的处理,譬如亮度调节,对比度调节,反交织。还有上字幕等等。另外,视频处理线程还处理视频设置的界面消息,包括播放的时候加载字幕等等。音频其实也有处理的,包括音量调节,混音,但是这些耗时都不大,所以在解码送到播放过程中直接完成了,并不需要单独线程执行。
4)音视频播放线程:根据时间戳分别负责音频和视频的播放。