# Start

# 1.ExoPlayer 起播时序图

ExoPlayer播放.drawio

# 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
41
protected 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 的播放代码,总结一下播放的流程:

  1. 创建 DataSource.Factory 工厂对象
  2. 创建 StyledPlayerView 播放器 UI 对象
  3. 创建 RenderersFactory 对象
  4. 创建 MediaSource.Factory 对象
  5. 创建 TrackSelector 对象
  6. 通过 ExoPlayer.Builder 对象构造 ExoPlayer 对象
  7. 添加播放器事件回调,设置默认音频参数
  8. 设置是否自动开始播放
  9. 开始起播

# 3. 重要的对象

  1. DataSource.Factory
    DataSource.Factory 是负责创建 DataSource 对象的工厂类

  2. DataSource 代表 Uri 识别的数据源,根据不同的协议从不同媒体介质中获取视频数据流
    下面是 ExoPlayer 实现了的数据源类型
    DataSource实现类

  3. StyledPlayerView
    播放器 UI 对象,包含了视频 UI,控制器 UI,字幕,专辑等

  4. RenderersFactory
    RenderersFactory 是负责创建 Renderer 的工厂对象。

  5. Renderer 渲染器
    ExoPlayer 定义了 6 种 Renderer 对象:

  • VideoRenderer 视频渲染器,负责视频渲染,实现类有 MediaCodecVideoRenderer,还有 ffmpeg 扩展
  • AudioRenderer 音频渲染器
  • TextRenderer 字幕渲染器
  • MetadataRenderer 视频元数据渲染器
  • CameraMotionRenderer 相机动作渲染器,CameraMotionRenderer 是处理相机拍摄的视频播放时,相机在物理上可能会有旋转动作,导致相机拍摄的视频也会产生 rotation,所以在播放相机拍摄的视频时需要解析视频中的 rotation 属性,然后在 OpenGL ES 渲染的时候,将窗口进行旋转,使画面恢复正常方向。
  • MiscellaneousRenderer 混合渲染器 ,Google 暂时没有实现该渲染器,应该是留作扩展用。
    Renderer实现类
  1. MediaSource.Factory
    MediaSource.Factory 是负责构造 MediaSource 对象的工厂类

  2. MediaSource 媒体源,ExoPlayer 使用 MediaSource 实现了多视频播放逻辑,还有不停了流媒体协议类型等。
    ExoPlayer 预定义的 MediaSource 类型:
    MediaSource实现类

  3. TrackSelector
    选择器:

  • 媒体流:用于在播放时选择容器中封装的的不同的视频、音频通道,比如在 HLS\DASH 流播放时根据网络带宽,设备性能选择不同分辨率的流。
  • 通道:播放时根据情况选择视频中不同的视频 \ 音频 \ 字幕通道。

# End

这里先粗略分析了一下 ExoPlayer 大致播放流程,还有部分的类的介绍,后面再根据情况对不同模块进行分析。