# Start
# 1.ExoPlayer 起播时序图
# 2.ExoPlayer 的初始化
先看看 ExoPlayer 的初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41protected StyledPlayerView playerView;
private DataSource.Factory dataSourceFactory;
void onCreate(@Nullable Bundle savedInstanceState){
//创建
dataSourceFactory = DemoUtil.getDataSourceFactory(/* context= */ this);
....
//获取在XML中声明的StyledPlayerView对象
playerView = findViewById(R.id.player_view);
...
}
//初始化ExoPlayer
void initializePlayer(){
//创建播放媒体列表对象
mediaItems = createMediaItems(intent);
//创建渲染器工厂对象
RenderersFactory renderersFactory =
DemoUtil.buildRenderersFactory(/* context= */ this, preferExtensionDecoders);
//创建媒体通道选择器对象
trackSelector = new DefaultTrackSelector(/* context= */ this);
...
//创建ExoPlayer对象
player = new ExoPlayer.Builder(/* context= */ this)
.setRenderersFactory(renderersFactory) //设置渲染器工厂对象
.setMediaSourceFactory(createMediaSourceFactory()) //设置媒体源工厂对象
.setTrackSelector(trackSelector) //设置媒体通道选择器
.build();
player.setTrackSelectionParameters(trackSelectionParameters);
//设置播放器事件回调
player.addListener(new PlayerEventListener());
//设置音频参数
player.setAudioAttributes(AudioAttributes.DEFAULT, /* handleAudioFocus= */ true);
//设置是否自动开始播放
player.setPlayWhenReady(startAutoPlay);
player.prepare();
...
}
上面就是 ExoPlayer 的播放代码,总结一下播放的流程:
- 创建 DataSource.Factory 工厂对象
- 创建 StyledPlayerView 播放器 UI 对象
- 创建 RenderersFactory 对象
- 创建 MediaSource.Factory 对象
- 创建 TrackSelector 对象
- 通过 ExoPlayer.Builder 对象构造 ExoPlayer 对象
- 添加播放器事件回调,设置默认音频参数
- 设置是否自动开始播放
- 开始起播
# 3. 重要的对象
-
DataSource.Factory
DataSource.Factory 是负责创建 DataSource 对象的工厂类 -
DataSource 代表 Uri 识别的数据源,根据不同的协议从不同媒体介质中获取视频数据流
下面是 ExoPlayer 实现了的数据源类型
-
StyledPlayerView
播放器 UI 对象,包含了视频 UI,控制器 UI,字幕,专辑等 -
RenderersFactory
RenderersFactory 是负责创建 Renderer 的工厂对象。 -
Renderer 渲染器
ExoPlayer 定义了 6 种 Renderer 对象:
- VideoRenderer 视频渲染器,负责视频渲染,实现类有 MediaCodecVideoRenderer,还有 ffmpeg 扩展
- AudioRenderer 音频渲染器
- TextRenderer 字幕渲染器
- MetadataRenderer 视频元数据渲染器
- CameraMotionRenderer 相机动作渲染器,CameraMotionRenderer 是处理相机拍摄的视频播放时,相机在物理上可能会有旋转动作,导致相机拍摄的视频也会产生 rotation,所以在播放相机拍摄的视频时需要解析视频中的 rotation 属性,然后在 OpenGL ES 渲染的时候,将窗口进行旋转,使画面恢复正常方向。
- MiscellaneousRenderer 混合渲染器 ,Google 暂时没有实现该渲染器,应该是留作扩展用。
-
MediaSource.Factory
MediaSource.Factory 是负责构造 MediaSource 对象的工厂类 -
MediaSource 媒体源,ExoPlayer 使用 MediaSource 实现了多视频播放逻辑,还有不停了流媒体协议类型等。
ExoPlayer 预定义的 MediaSource 类型:
-
TrackSelector
选择器:
- 媒体流:用于在播放时选择容器中封装的的不同的视频、音频通道,比如在 HLS\DASH 流播放时根据网络带宽,设备性能选择不同分辨率的流。
- 通道:播放时根据情况选择视频中不同的视频 \ 音频 \ 字幕通道。
# End
这里先粗略分析了一下 ExoPlayer 大致播放流程,还有部分的类的介绍,后面再根据情况对不同模块进行分析。