最近因为一个新项目需要一个多媒体播放器,所以需要做个视频、音频、图片方面的播放器。也查阅了不少这方面的资料,如果要从头做一个播放器工作量太大了,而且难度也很大。所以最后选择了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的解码核心移植出来,做成一个可以方便使用的第三方库。主要是移植到我个人业余开发的一款网络收音机上面使用。另外就是独立出来,方便移植使用。

相关文章

Linux 下编译Android-VLC开源播放器详解(附源码下载)

Edited by mythou

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3235698.html 

Android VLC播放器二次开发1——程序结构分析的更多相关文章

  1. Android VLC播放器二次开发3——音乐播放(歌曲列表+歌词同步滚动)

    今天讲一下对VLC播放器音频播放功能进行二次开发,讲解如何改造音乐播放相关功能.最近一直在忙着优化视频解码部分代码,因为我的视频播放器需要在一台主频比较低的机器上跑(800M主频),所以视频解码能力受 ...

  2. Android VLC播放器二次开发2——CPU类型检查+界面初始化

    上一篇讲了VLC整个程序的模块划分和界面主要使用的技术,今天分析一下VLC程序初始化过程,主要是初始化界面.加载解码库的操作.今天主要分析一下org.videolan.vlc.gui.MainActi ...

  3. 搭建rtmp直播流服务之4:videojs和ckPlayer开源播放器二次开发(播放rtmp、hls直播流及普通视频)

    前面几章讲解了使用 nginx-rtmp搭建直播流媒体服务器; ffmpeg推流到nginx-rtmp服务器; java通过命令行调用ffmpeg实现推流服务; 从数据源获取,到使用ffmpeg推流, ...

  4. android音乐播放器开发教程

    android音乐播放器开发教程 Android扫描sd卡和系统文件 Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能 android操作sdcard中的多媒体文件——音乐列表 ...

  5. 使用vlc播放器做rtsp流媒体服务器

    可参考: 使用vlc播放器播放rtsp视频 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器做rts ...

  6. 使用vlc播放器播放rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 web网页中使用vlc插件播放相机rtsp流视频 使用vlc进行二次开发做自己的播放器 首先需要安装vlc播放器,下载及安装步骤略 使用vlc播放器播放rt ...

  7. 使用Vitamio打造自己的Android万能播放器(6)——在线播放(播放列表)

    前言 新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能.本章内容为"在线视频播放列表& ...

  8. 使用Vitamio打造自己的Android万能播放器(3)——本地播放(主界面、播放列表)

    前言 打造一款完整可用的Android播放器有许多功能和细节需要完成,也涉及到各种丰富的知识和内容,本章将结合Fragment.ViewPager来搭建播放器的主界面,并实现本地播放基本功能.系列文章 ...

  9. 使用Vitamio打造自己的Android万能播放器(1)——准备

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...

随机推荐

  1. WPF TreeView绑定字典集合

    <TreeView Name="Tree" HorizontalAlignment="Left" Height="269" Width ...

  2. 图解equals与hashcode方法相等/不相等的互相关系

    图解:比如equals相等的箭头指向hashcode相等,表示equals相等那么必有hashcode相等.而有两个箭头指向别人的表示可能是其中之一,比如hashcode相等,那么有可能equals相 ...

  3. C/C++中的getline函数总结:

    来自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html C/C++中的getline函数总结 getline函数是一个比较 ...

  4. Asp.Net之后台加载JS和CSS

    在Asp.Net开发时,用到的JS库.通用的CSS等,在许多页面都会用到,而每次都需要手动引入,相当麻烦,而且有时一旦忘了引用,还得找半天才能找到问题.那有没有什么办法能够一劳永逸的呢?答案是有的. ...

  5. CMS介绍

    CMS介绍 CMS是Content Management System的缩写,意为“内容管理系统”,它具有许多基于模板的优秀设计,可以加快网站开发的速度和减少开发的成本. CMS的功能不仅限于处理文本 ...

  6. html 特殊字符 fmt table A

    html 特殊字符 “&”表示“&” “ ”表示空格 <fmt:bundle basename=""> basename制定配置文件的文件名,无须扩展名 ...

  7. cocos进阶教程(3)Cocos2d-x多场景切换生命周期

    在多个场景切换时候,场景的生命周期会更加复杂.这一节我们介绍一下场景切换生命周期. 多个场景切换时候分为几种情况: 情况1,使用pushScene函数从实现HelloWorld场景进入Setting场 ...

  8. HDU 3998 Sequence(经典问题,最长上升子序列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3998 解题报告:求一个数列的最长上升子序列,并求像这样长的不相交的子序列最多有多少个. 我用的是最简单 ...

  9. Android通过URL加载网络图片

    public static Bitmap getBitmap(String path) throws IOException { URL url = new URL(path); HttpURLCon ...

  10. PHPStorm+Wamp+Xdebug+Windows7调试代码

    Wamp 集成环境 PHPStorm+Xdebug 调试代码 2013.04.16 花了两个小时时间终于 , 配置成功了 ! 我的开发环境如下 , 其它环境也可以参考我的配置 开发环境 : Windo ...