最近因为一个新项目需要一个多媒体播放器,所以需要做个视频、音频、图片方面的播放器。也查阅了不少这方面的资料,如果要从头做一个播放器工作量太大了,而且难度也很大。所以最后选择了VLC作为基础,进行二次开发。选择VLC的原因有两个,第一:VLC在其他平台很成熟,解码器方面支持很完善。第二:VLC已经实现了完整的视频播放和音频播放功能。开发速度可以加快很多。
下面给出两张截图,主要是为了方便后面讲解程序结构使用,可以对照着图片看。界面和原版VLC差不多,我只是把ActionBar和视频列表做了一些调整。
(PS:新建的QQ群,有兴趣可以加入一起讨论:Android群:322599434)
1、背景
一开始本来是想修改Android自带的Gallery3D程序,因为这个程序自带了视频播放功能,不过解码方面并不理想,很多格式不支持。无奈只能选用第三方的解码库,因此最后才选择了VLC作为二次开发基础。选择它的原因上面已经说过,这里不重复。
VLC播放器不多介绍,相信做过音视频的朋友都了解,而且它基本上支持目前常见的平台。我这次二次开发的目的是把VLC原本的界面和一些播放控制修改一下,适应平板电脑上面使用,另外一个就是想掌握VLC的解码库如何使用。第一个目的,修改界面难度不会很大,因为整个界面逻辑结构,我不需要大改,只是做一些调整。所以主要目的就是了解VLC整个程序的实现。
目前对VLC的分析主要是java层的实现,解码库那方面现在还没精力去分析,而且那一块也比较复杂。后面有时间,在考虑解码库的分析。目前主要是分析java部分代码和如何使用解码库。阅读优秀开源项目可以学到不少东西,分析Launcher就让我提高了不少,也学到了很多Android的开发知识,例如:多个ViewGroup和view之间处理触摸事件的流程。通过分析Launcher对Android触摸机制了解很深入。相信通过这次分析和修改VLC播放器,也能学到很多新知识。
另外补充一点,VLC的源码都是开源的(包括解码库部分代码),可以用git获取,自行编译即可,我前面已经写了一篇详细获取VLC源码和编译的文章,如果不了解如何获取源码和如何编译的朋友,可以查看文章最后的链接。那篇文章提供了一个VLC的工程,可以直接导入到Eclipse里面使用。
2、程序结构
整个VLC播放器的模块可以分为下面几个重要的模块:
- VLCLib解码库
- 界面GUI
- 音频部分
- 视频部分
- 接口定义
- 控件和widget
整个程序可以划分为上面的主要模块,对应上面源码的src包目录就可以看出来,至于每部分模块具体代码类,这里暂且不说,我个人也还没有完全分析完。只是掌握了程序结构和每个类大概功能。具体的后面我分析了,会继续写相关文章。
直接主要说说程序界面逻辑,从我上面给出的截图可以看出来,程序刚启动默认就是进入视频列表。VLC的界面主要是由SlidingMenu和ActionBar构成,里面嵌入了好几个Fragment。SlidingMenu负责功能模块的切换(视频、音频、目录),具体进入视频还是音频,这个就是切换Fragment,也就是说具体的功能实现都是由Fragment实现的。SLidingMenu就是提供了切换功能,ActionBar提供了一些常用功能按钮,搜索、刷新、视频流输入、排序、设置等功能。大部分界面都会存在ActionBar,除了音频和视频播放界面。
3、程序主要模块简述
程序的入口类是org.videolan.vlc.gui.MainActivity,也就是上面目录里面的gui下面的主Activity,这个Activity主要是检测VLC解码库以及创建相关界面的类对象和初始化功能,还有就是响应SlidingMenu和ActionBar的操作。具体的代码分析,下一篇文章再进行,今天先讲解个大概逻辑。
视频模块的入口是视频列表org.videolan.vlc.gui.video.VideoGridFragment,上面已经说过,VLC的界面大部分都是基于Fragment实现的,视频列表也是基于Fragment,具体播放界面是另外一个Activity——VideoPlayerActivity,video包下面主要就是这两个类实现了视频播放的功能,一个是列表界面,一个是视频播放界面。其他的就是一些适配器和辅助类,到时候对视频详细解析的时候,再讲解相关类。
音频模块主要是org.videolan.vlc.gui.audio.AudioBrowserFragment类是入口,音频播放模块里面又分了几个页面,实现了类似ViewPaper的滑动切换功能,这个倒是和元素Android的Music布局差不多。这些具体到时候分析音频模块在讲解。
Widget和控件模块:这两个主要是实现了一些VLC自己的控件以及桌面的Widget,VLC做了一个桌面Widget是用来播放音频的,跟Android原生Music的Widget类似。
4、总结
今天主要是介绍一下VLC的代码结构和主要的功能模块,下一篇文章开始会介绍VLC具体模块的分析。还有把我个人修改的情况记录下来,给有这方面开发需要的朋友参考一下。其实VLC整个java部分的代码还是挺多的,而且逻辑结构也区分很仔细。如果你已经分析过一些代码量比较多的开源工程,那分析VLC并不困难,但是如果你阅读的代码不多,这个对你来说可能是一个比较难的坎。
整个工程其实用到了挺多技术,例如SlidingMenu、ActionBar、Fragment、AIDL、Widget、自定义View等等,如果你对这些技术都不熟悉,建议你先了解一下,特别是SlidingMenu和Fragment,这两个基本上构建了整个VLC播放器的界面。
另外,我打算把VLC解码库的使用方法弄清楚,因为我打算把VLC的解码核心移植出来,做成一个可以方便使用的第三方库。主要是移植到我个人业余开发的一款网络收音机上面使用。另外就是独立出来,方便移植使用。