Android VLC播放器二次开发1——程序结构分析

2023-10-27

最近因为一个新项目需要一个多媒体播放器,所以需要做个视频、音频、图片方面的播放器。也查阅了不少这方面的资料,如果要从头做一个播放器工作量太大了,而且难度也很大。所以最后选择了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 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 什么是适合 Android 的 html 解析器?

    什么是适合 Android 的 html 解析器 这取决于你想做什么 如果你真的想处理 html Java 中有很多 html 解析器可以使用 这里有一些 https stackoverflow com questions 2168610
  • 如何自定义 Firebase 身份验证 ui

    我正在使用 Firebase Auth Ui 进行号码验证 我有一些要求 需要更改国家旋转器下拉项目的文本和背景颜色 我正在使用下面的样式 但它不会改变下拉菜单的背景颜色或项目的文本颜色 style name FirebaseUI Coun
  • 当活动被破坏时如何保存状态

    public class Talk extends Activity private ProgressDialog progDialog int typeBar TextView text1 EditText edit Button res
  • Android - 如何使密封类扩展其他密封类?

    我的 UIState 有一个密封的界面 sealed interface UIState
  • 在 Android 上生成 FileDescriptor 而不先打开文件

    在Android中 是否可以直接从字节数组生成FileDescriptor 而不必先打开文件 在 Android 2 2 中 我动态生成 MIDI 文件 然后使用 MediaPlayer 进行播放 我在下面包含了成功执行此操作的 Main
  • 在 ubuntu 中找不到 .android 文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我在哪里可以找到 android在 Ubuntu 中 我想使用debug keystore 转到您的主文件夹并按 ctrl h 瞧
  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • Android任务执行中的“platformAttrExtractor”是什么?

    我介绍了我的构建关注者操作说明 https developer android com studio build optimize your build html profile在安卓中 gradlew profile recompile
  • 通过模拟器控制台或 ADB 更改 Android 模拟器方向

    我正在尝试构建一个自动化测试框架 用于检查应用程序应该响应的基本内容 而不会崩溃 其中之一是检查应用程序是否正确响应配置更改 现在 由于它是自动化的 我必须以编程方式在横向和纵向之间切换模拟器的方向 并观察它是否崩溃 大写 因为有很多与 c
  • adb 今天无法连接到 VirtualBox 中的 Android-x86

    我在 VirtualBox 中成功安装了 Android x86 v3 2 eeepc 一段时间 这是帮助我在 Android 上调试 USB 主机应用程序的好方法 此类配置的安装是 安装VirtualBox 将 Android x86 v
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • java.lang.AssertionError:CALL 'public final fun

    我正在尝试使用 jetPack Compose 制作一个项目 我拥有它工作所需的所有必要依赖项 但是当我运行我的应用程序时 它会抛出一个错误 我找不到解决方案 这是错误 java lang AssertionError CALL publi
  • Android:外部存储上的 mkdirs()/mkdir() 返回 false

    我对此感到疯狂 Log d STATE Environment getExternalStorageState File f new File Environment getExternalStoragePublicDirectory En
  • 以编程方式创建 FloatingActionButton(无需 xml)

    我很欣赏 Android 的 FloatingActionButton fab 功能 并希望在我的项目中的许多不同地方使用它们 现在 我有这样的东西 我有几个 xml 规范 除了 id 图标和 onclick 之外 所有这些规范都是相同的
  • 解析 XML 标签不匹配时出错

  • 通过 Google 帐户从 Google Play 安装的应用程序列表

    以下是我的问题 是否可以通过使用任何 api 以编程方式通过 Google Play 获取用户已安装的应用程序列表 请注意 我并不是询问设备中当前安装的应用程序列表 而是询问在某个时刻已安装的应用程序列表 我需要解决上述问题 因为我正在考虑
  • Dart/Flutter 如何编译到 Android?

    我找不到任何具体的资源 Dart 是否被编译到 JVM 或者 Google 的团队是否编译了 Dart VM 以在 JVM 上运行 然后在 JVM 内的 Dart VM 中运行 Dart 前者更有意义 并且符合 无桥 的口号 但后者似乎更符
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • Recyclerview项目点击涟漪效果[重复]

    这个问题在这里已经有答案了 我正在尝试添加Ripple影响到RecyclerView的项目 我在网上查了一下 但找不到我需要的东西 我努力了android background归因于RecyclerView本身并将其设置为 android

随机推荐

  • Python-reduce()

    functools reduce function iterable initializer 将两个参数的 function 从左至右积累地应用到 iterable 的条目 以便将该可迭代对象缩减为单一的值 例如 reduce lambda
  • vb基于SC结构服装专卖店设计与实现

    摘 要 本论文描述了 服装专卖店店管理系统 的设计与实现 在我国数量众多的企业中 中小企业占了绝大多数 这些企业也不可避免地要加入国际化企业的竞争行列 而实现企业信息化是参与挑战的必要条件 但是中小企业的多样性及其灵活多变的经营方式 加上相
  • 【Python 3.7】立方:数字的三次方被称为其立方。请绘制一个图形,显示前 5个整数的立方 值,再绘制一个图形,显示前 5000个整数的立方值。

    题目 Python 3 7 立方 数字的三次方被称为其立方 请绘制一个图形 显示前 5个整数的立方值 再绘制一个图形 显示前 5000个整数的立方值 前 5个整数的立方值的程序为 import matplotlib pyplot as pl
  • TPS5430设计24v转15v电源

    目录 前言 一 芯片输入输出特性 1 输出电压 2 输出电流 3 输出功率 二 芯片各引脚的设计和外围电路元器件的选型 1 ENA脚 2 VIN脚的输入电容 3 输入纹波 4 分压电阻 5 输出电感 6 输出电容 7 BOOT电容器 8 环
  • linux基本命令,一份就够了,初学者指南,基于centos和redhat

    一 文件或者文件本身 ls a 显示隐藏文件 l 长格式显示 h 人性化显示 显示文件大小 d 显示目录本身非目录里面的内容 touch 可改变文件时间戳 mkdir 创建多个目录mkdir a b c p 创建多级目录 mkdir a b
  • SpringBoot2.0(过滤器,监听器,拦截器)

    目录 一 过滤器 1 1 自定义Filter 1 2 启动类代码 1 2 创建filter类和LoginFilter包 1 2 1 编写loginFilter类 过滤器代码 1 2 2 创建二个Controller类 二 监听器 2 1 自
  • 2023年智能车辆国际会议(ICoIV 2023)

    2023年智能车国际会议 ICoIV 2023 重要信息 会议网址 www icoiv org 会议时间 2023年5月26 28日 召开地点 中国长沙 截稿时间 2023年3月20日 录用通知 投稿后2周内 收录检索 EI Scopus
  • 利用php的mail()函数发送邮件

    利用PHP的mail函数发送邮件 mail 函数的作用 连接到邮件服务器 利用smtp协议 与该服务器交互并投邮件 注意 1 mail函数不支持esmtp协议 即只能直投不能登录 2 由上条知 我们只能直投至最终的收件服务器地址 而该地址需
  • Vuex——控制侧边栏是否折叠使用vuex,本次简单使用到了state,mutations

    项目中在store vuex js 使用vuex管理isCollapse export default state isCollapse false 默认不折叠 mutations collapseMenu state state isCo
  • 中国蚁剑安装使用教程

    中国蚁剑安装使用教程 前言 一 中国蚁剑安装 二 中国蚁剑使用 2 1中国蚁剑连接木马 2 2中国蚁剑设置代理 2 3中国蚁剑参数设置 2 4中国蚁剑其他使用 三 中国蚁剑绕过Waf 3 1 编码绕过WAF 3 2插件绕过waf 3 3 修
  • windows ce操作系统能用哪个导航_Windows 和 Linux 比较

    1 操作系统设计复杂度对比 就操作系统复杂度windows server 要比 linux server 更复杂 2 市场占有率对比 特指的服务器市场占有率 非PC桌面 1 linux 大多数版本是免费的 windows 收费 在大规模集群
  • 基于matlab的长短期神经网络lstm的股票预测

    目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的股票预测 MATALB编程实现 附有代码 及链接基于matlab编程的的长短期神经网络LSTM的股票价格的预测 基于深度学习神经网络的股票价格预测 深度学
  • Unity 中控(二)

    前面写到控制投影 接着就是对电脑的开关的控制 依然是先到网上查资料 然后总结下 在同一局域网下 远程开电脑是同通过网卡的Mac地址 UDP广播数据实现开机 关机是调用系统的运行命令 shutdown s m 192 168 0 106 t
  • 10个每个人都用得到的视频下载网站

    1 油管视频下载 www 4kvideodownloader com 2 哔哩哔哩视频解析下载 bilibili iiilab com 3 小视频下载 www downfi com video 4 图二工具 www tool2 cn 5 小
  • Spring MVC-表单(Form)标签-文件上传(File Upload)示例(转载实践)

    以下内容翻译自 https www tutorialspoint com springmvc springmvc upload htm 说明 示例基于Spring MVC 4 1 6 以下示例显示如何使用Spring Web MVC框架在表
  • k8s 之二 kubeadm安装k8s集群

    1 概述 k8s的部署常见的工具和环境 1 IaaS 虚拟机 1 1托管模型 部署在公有云上 K8SaaS 目前没有用于生产环境 1 2VPS 和本地物理机搭建一样 但是这里网络是虚拟网络了 2 物理机 3 1 构建工具 Rancher 2
  • 面向ASIC设备的编译器框架:TVM or MLIR?

    2019 2021年 摩尔定律失效 这一关键词频频出现于各大技术网站 在此背景下 市面上多如牛毛的AI芯片公司不约而同地给出了通用CPU 专用ASIC芯片的方案 以应对日益增长的AI边 端侧推理计算需求 在AI DSA芯片的开发实践中 棘手
  • jar包打成docker镜像文件推送至服务器,服务器拉取并重启容器

    windows电脑需要去docker官网下载Docker Desktop 这里需要注意两点 windows电脑需要开启hyper v 控制面板 所有控制面板项 程序和功能 启用或关闭Windows功能 勾选上 然后等待系统重启应用 Dock
  • 关于NgRx的状态管理

    什么是NgRx 简单的讲 NgRx 是继 Redux 之后 结合 RxJs 的产物 可以说 它是 Angular 天生的 伴侣 帮助 Angular 做状态管理 NgRx 主要有三种模式 分别为 NgRx Store NgRx Effect
  • Android VLC播放器二次开发1——程序结构分析

    最近因为一个新项目需要一个多媒体播放器 所以需要做个视频 音频 图片方面的播放器 也查阅了不少这方面的资料 如果要从头做一个播放器工作量太大了 而且难度也很大 所以最后选择了VLC作为基础 进行二次开发 选择VLC的原因有两个 第一 VLC