ExoPlayer源码分析--模块及工程篇

ExoPlayer是Android流行的开源播放器,具备出色的兼容性和高度定制性。它允许用户自定义插件以支持不同媒体格式,并通过工厂模式创建组件。文章探讨了ExoPlayer的组件化架构、扩展库(如vp9)的编译与使用,以及其优雅的组件装配方式,展示了其核心组件如MediaSource、Renderer和Decoder的工作原理。

1 简介

ExoPlayer是android非常流行的开源播放器框架,它以其出色的兼容性,在很大程度上已取代了android系统的媒体播放器,成为媒体类应用软件的标配。
初次使用ExoPlayer,涉及的类比较多,会觉得使用比较复杂;但实际上,ExoPlayer并不是给初级用户使用的,它提供了更高级的定制能力,可以支持比Android原生库更高级的媒体支持能力;甚至,用户还可以自己定义插件,支持不同的媒体格式。
更神奇的地方在于,Exoplayer这些组件并不是一整个的库,而是提供了不同的maven坐标,供客户端组合使用, 如HLS、dash、rtsp, 甚至还提供了一些依赖三方库的插件,如okhttp、ffmpeg、av1、vp9。
这篇文章并不是Exoplayer的使用文档,而是通过分析ExoPlayer的工程组织和扩展机制,了解其中组件化的思想和插件机制的奥妙。

2 基本知识

先看一段Exoplayer中的使用样例源码,涉及了很多类

mediaItems = createMediaItems(intent);  
if (mediaItems.isEmpty()) {  
  return false;  
}  
  
lastSeenTracks = Tracks.EMPTY;  
ExoPlayer.Builder playerBuilder =  
    new ExoPlayer.Builder(/* context= */ this)  
        .setMediaSourceFactory(createMediaSourceFactory());  
setRenderersFactory(  
    playerBuilder, intent.getBooleanExtra(IntentUtil.PREFER_EXTENSION_DECODERS_EXTRA, false));  
player = playerBuilder.build();  
player.setTrackSelectionParameters(trackSelectionParameters);  
player.addListener(new PlayerEventListener());  
player.addAnalyticsListener(new EventLogger());

涉及到的一些重要的单元或类:

  • MediaItem: 播放的单元,一般是一个文件或url
  • Track: 轨道,如视频轨道,音频轨道,字幕等; 音频可能有多个,可以选择不同的语言; 字幕也有可能有多个,可以选择不同的语言的字幕
  • MediaSource: 代表可以被ExoPlayer播放的媒
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值