安卓手机APP开发__媒体开发部分__播放器的接口
目录
一个播放器是你的APP中完成媒体项的播放的组件.
媒体3的播放器接口提供了一个关于播放器处理的功能的总结.
这包括如下的内容:
对于播放的控制,例如播放,暂停,查找与查询当前的媒体的属性
例如播放位置.
管理一个播放列表/媒体项的队列
配置播放属性,例如缓冲,重复,速度,和音量.
向屏幕上渲染视频
媒体3也提供了一个播放器的接口的实现,叫做ExoPlayer.
在媒体3中的一些组件实现了播放器的接口.例如:
组件 | 描述与行为的解释 |
---|---|
ExoPlayer | 这是播放器接口的默认的实现 |
MediaController | 与媒体会话的交互来发送播放的命令.如果你的播放器与在一个服务中的媒体会话独立于活动和片段, 你能让你的媒体控制器作为播放器.通过媒体会话让你的播放和播放列表的方法调用发给播放器. |
MediaBrowser | 除了媒体控制器提供的功能,和一个媒体库会话的交互,来浏览可用的媒体内容. |
ForwardingPlayer | 把方法调用转给另一个播放器的播放器实现.使用这个类定制化特别的方法. |
SimpleBasePlayer | 把方法的实现变得最小的播放器的实现.当你要使用一个连接媒体会话的定制化的播放器时很有用. |
CastPlayer | 和一个广播接收器的APP通信的播放器实现.它的行为依赖于广播的会话. |
如果你和播放器通信,你应该直接调用它的方法来发播放的指令.
你能在你的播放中加上广告,通过实现一个媒体会话,给外部的源
授权它进行播放控制.这些外部的源实现了一个媒体控制器,它的功能是
连接一个媒体会话,和发出播放指令的请求.
当在后台播放媒体时,你需要保持你的媒体会话和有一个媒体会话服务
和媒体库服务的播放器作为一个前台的服务来运行.如果你这么做,你能
让你的播放器与你的APP中的活动独立出来.你在使用一个媒体控制器时
这是必要的.
一个媒体播放器的状态实现了播放器的接口,包括了4类主要的信息:
第一类:播放状态
使用getPlaybackState()来检索状态.
状态的值由接口来定义,有STATE_IDLE, STATE_BUFFERING, STATE_READY, and STATE_ENDED.
第二类:媒体项的播放列表
播放的媒体项的实现的序列
使用getCurrentTimeline()来检索时间线
播放器实例能提供播放列表的方法,例如加媒体项,删除媒体项,得到当前媒体项.
第三类:播放/暂停属性,例如:
playWhenReady:当可能时或者是保持暂停时,显示用户是否要媒体播放
Playback suppression reason:显示播放挂起的原因
isPlaying:显示播放是否正在播放,如果播放状态为STATE_READY,playWhenReady为真,
并且没有播放挂起时,这个值为真.
第四类:播放位置包括:
Current media item index:在播放列表中的当前媒体项的索引
isPlayingAd: 显示是否正在播放一个插入的广告
Current playback position:当前的媒体项或者是插入的广告的当前播放位置.
此外,播放器接口允许读取可用的轨道,媒体元数据,播放速度,音量和播放的其它的附加的属性.
注意的是播放器实例没有必要支持接口的所有的特性.
使用一个Player.Listener来监听一个播放器的改变.
Kotlin
- val handler = Handler(Looper.getMainLooper())
- fun checkPlaybackPosition(delayMs: Long): Boolean =
- handler.postDelayed(
- {
- val currentPosition = player.currentPosition
- // Update UI based on currentPosition
- checkPlaybackPosition(delayMs)
- },
- delayMs)
播放器的接口提供了操纵播放的状态和控制方面的很多的方法.
基本的播放控制有播放,暂停,准备和停止.
播放列表的方法有加媒体项和删除媒体项.
查找当前的媒体项或者是位置.
设置重复模式和乱序模式.
刷新轨道选择的信息
设置播放速度.
为了创建一个定制的播放器,你能扩展一个媒体3中的简单播放器.这个类提供了一个基本的实现.
它把你需要实现的方法的数量减少到了最小的程度.
通过覆盖getState()方法来开始,这个方法包括:
可用的指令集
播放属性例如当播放状态为STATE_READY时,是否开始播放。当前的播放的媒体项的索引,当前
项的播放位置。
Kotlin
- class CustomPlayer : SimpleBasePlayer(looper) {
- override fun getState(): State {
- return State.Builder()
- .setAvailableCommands(...) // Set which playback commands the player can handle
- // Configure additional playback properties
- .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST)
- .setCurrentMediaItemIndex(0)
- .setContentPositionMs(0)
- .build()
- }
- }
简单播放器强调了状态值的有效组合的状态。它也能处理监听器和通知状态改变的监听器。
如果你需要手工地触发一个状态上的刷新,就调用invalidateState().
除了getState()方法,你仅需要实现你的播放器声明可用的指令的方法。