ExoPlayer2-使用
https://google.github.io/ExoPlayer/guide.html
缺点
- 使用ExoPlayer时,Android版本必须在Android 4.1(API level 16)以后,因为ExoPlayer播放音频、视频是基于Android 4.1上增加的
MediaCodec
接口实现的 - Widevine这个数字版权管理功能只能在Android 4.4(API level 19)后才能使用
Library overView
ExoPlayer library 最核心的部分是ExoPlayer
接口。它提供了视频播放中最常用的功能,如播放,暂停,拖动,缓冲视频。ExoPlayer
将视频的加载和渲染抽象为如下三个组件:
MediaSource
负责媒体的下载,播放,决定已缓冲的媒体是否可读。`MediaSource`通过`ExoPlayer.prepare`函数注入使用
TrackSelector
负责从`MediaSource`中获取媒体块数据,提供给`Renderer`渲染使用。在player创建的时候注入使用
LoadControl
负责`MediaSource`中何时、如何缓冲数据的策略,在player创建时注入使用
Library中针对常用情况对三个组件有默认的实现,为了方便自定义扩展功能,他们都是通过注入的方式传入ExoPlayer。
Getting started
使用ExoPlayer步骤
- 项目中添加
Library
依赖 - 创建
SimpleExoPlayer
实例 - 关联Player到View(显示视频画面,接收用户输入)
- 为Player准备好
MediaSource
,并播放 - 播放结束后,释放player资源
添加library
以来
项目build.gradle
文件中添加仓库地址
repositories { |
module build.gradle
文件中添加以来
//添加库的全部特性 |
或者按需添加
compile 'com.google.android.exoplayer:exoplayer-core:r2.X.X' |
完整的ExoPlayer libray
包含如下独立的library module
- exoplayer-core: Core functionality (required).
- exoplayer-dash: Support for DASH content.
- exoplayer-hls: Support for HLS content.
- exoplayer-smoothstreaming: Support for SmoothStreaming content.
- exoplayer-ui: UI components and resources for use with ExoPlayer.
创建player
// 1. Create a default TrackSelector |
关联Player到View
ExoPlayer library
提供SimpleExoPlayerView
,它包含PlaybackControlView
和Surface
。可以在layout.xml文件中直接使用它,关联代码如下:
// Bind the player to the view. |
如果需要自定义视频的控制和视频渲染,可以使用SimpleExoPlayer
的如下方法
setVideoSurfaceView
setVideoTExtureview
setVideoSurfaceHolder
setVideoSurface
Player准备
MediaSource
代表着媒体资源,所以需要在ExoPlayer.prepare
时就创建好,并传入一个MediaSource
。ExoPlayer library中提供了默认如下默认的实现:
- DashMediaSource -> DASH
- SsMediaSource -> SmoothStreaming
- HlsMediaSource -> HLS
- ExtractorMediaSource -> regular media files
播放mp4文件代码示例:
// Measures bandwidth during playback. Can be null if not required. |
控制播放
当player准备好了以后,可以如下方法控制播放:
- setPlayWhenReady
- seekTo
- setRepeatMode
- setPlaybackParameters
释放资源
播放结束后需要释放video decoders
等有限的资源给其他应用使用,调用ExoPlayer.release
释放资源。
MediaSource
MediaSource
实例不能重复使用,如果需要多次初始化player,每次都必须使用新的实例
- DashMediaSource
- SsMediaSource
- HlsMediaSource
- ExtractorMediaSource
- MergingMediaSource
- LoopingMediaSource
- ContractenatingMediaSource
- DynamicConcatenatingMediaSource
加载字幕文件
提供一个视频文件和字幕文件,mergingMediaSource
可以将他们合并为一个资源来播放
// Build the video MediaSource. |
循环播放视频
有两种方法
ExoPlayer.setRepeatMode (推荐)
使用LoopingMediaSource
MediaSource source = new ExtractorMediaSource(videoUri, ...);
// Plays the video twice.
LoopingMediaSource loopingSource = new LoopingMediaSource(source, 2);
播放视频列表
ConcatenatingMediaSource
可以实现无缝播放视频列表,视频列表的文件格式和视频清晰度都可以不同。
MediaSource firstSource = new ExtractorMediaSource(firstVideoUri, ...); |
DynamicConcatenatingMediaSource
和ConcatenatingMediaSource
类似,只是可以播放过程中添加,删除播放列表内容。
注意MediaSource
不能重复添加,或者添加之前删除过的MediaSource
。需要使用新的实例
播放视频A两次,后播放视频B(A,A,B)
MediaSource firstSource = new ExtractorMediaSource(firstVideoUri, ...); |
or
MediaSource firstSource = new ExtractorMediaSource(firstVideoUri, ...); |
注意此处firstSource这个MediaSource
实例使用了两次,仅限特殊函数才能使用同一实例
Player Events
常用的方法有
- addListener
- removeListener
- addVideoListener
- setVideoDebugListener
- setAudioDebugListener
Sending messages to components
- sendMessages
- blockingSendMessages
自定义
可以自定义实现如下组件
- Renderer -> 自定义Renderer支持新类型的媒体
- TrackSelector -> 自定义如何提供数据给Renderer
- LoadControl -> 自定义缓存策略
- Extractor -> 自定义实现支持新的格式
- MediaSource -> 自定义如何提供数据给Renderer
- DataSource -> 自定义如何下载数据,例如通过自定义协议下载数据或者通过本地缓存加载数据
数字版权保护
这里介绍如何在Android 4.4及以上版本的设备上播放,DRM相关的媒体,用不到,略…