安卓手机APP开发__媒体开发部分__直播流
目录
概述
检查和监控直播的播放
在直播流中的定位查找
直播播放的用户界面
配置直播播放的参数
播放速度调整
定制播放速度的调整算法
直播窗口背后的异常和ERROR_CODE_BEHIND_LIVE_WINDOW
概述
ExoPlayer没有任何特殊配置的情况下,播放绝大多数的
盒外的可适配的直播流。
可适配的直播流提供了一个可用的媒体的一个窗口,这个媒体
是在常规的时间间隔之间进行更新的,更新为当前的实时时刻.
这意味着播放的点位将总是在这个窗口的某一个位置,在大部分
时候,在直播流被生成时它离当前的实时时刻很近.在当前的实时
时刻与播放的点位之间的差距被叫做直播时延.
检查和监控直播的播放
一个直播窗口的每一次刷新,被注册的播放器的监听器实例将
收到一个onTimelineChanged事件.
Player.isCurrentWindowLive显示了当前的播放的媒体项
是否是一个直播流.即使直播流已经结束了,这个值还是真.
Player.isCurrentWindowDynamic显示了当前的播放的媒体项
是否仍然在被更新.对于没有结束的直播流来说,它的值是真的.
Player.getCurrentLiveOffset返回直播的时延.
Player.getDuration返回当前的直播窗口的长度.
Player.getCurrentPosition返回直播窗口中播放位置到开始位置的距离.
在直播流中的定位查找
在直播窗口中你能使用Player.seekTo,查找定位到任何一个位置.
这个查找的位置是相对于直播窗口的开始位置的.
直播窗口有一个默认的位置是被认为是播放开始的位置.这个位置通常
与直播边界比较近的.你能调用Player.seekToDefaultPosition得到这个默认位置.
直播播放的用户界面
ExoPlayer的默认的用户界面的组件显示出直播窗口的长度和当前的播放位置.
这意味着每一次直播窗口的刷新,直播的位置在向后跳.如果你需要不同的行为,
例如显示当前的UNIX时间,或者是当前直播的时间,你能定制PlayerControlView
修改这个类来满足你的需求.
配置直播播放的参数
ExoPlayer使用一些参数来控制播放位置的距离,播放速度的范围也能调节.
根据优先级的降序,你能从三个地方得到这些参数:
被传递到MediaItem.Builder.setLiveConfiguration的媒体项的值
在DefaultMediaSourceFactory的全局默认值
从媒体中直接读取的值
Kotlin
// Global settings.
val player =ExoPlayer.Builder(context).setMediaSourceFactory(DefaultMediaSourceFactory(context).setLiveTargetOffsetMs(5000)).build()// Per MediaItem settings.
val mediaItem =MediaItem.Builder().setUri(mediaUri).setLiveConfiguration(MediaItem.LiveConfiguration.Builder().setMaxPlaybackSpeed(1.02f).build()).build()
player.setMediaItem(mediaItem)
可用的配置值有:
targetOffsetMs:目标直播时延
minOffsetMs:最小直播时延
maxOffsetMs:最大直播时延
minPlaybackSpeed:最小播放速度
maxPlaybackSpeed:最大播放速度
播放速度调整
当播放一个低延时的直播流时,ExoPlayer通过稍微地改变
播放速度,来调整直播时延.播放器将匹配媒体或者是APP提供的
目标时延,但也将试图反馈要改善网络条件.
如果自动地调整播放速度不被允许,能通过设置参数minPlaybackSpeed和
maxPlaybackSpeed为1 .
定制播放速度的调整算法
如果播放速度的调整被启用,LivePlaybackSpeedControl定义了调整
做了什么.实现一个定制的LivePlaybackSpeedControl是可能的.
Kotlin
val player =ExoPlayer.Builder(context).setLivePlaybackSpeedControl(DefaultLivePlaybackSpeedControl.Builder().setFallbackMaxPlaybackSpeed(1.04f).build()).build()
DefaultLivePlaybackSpeedControl的相关的定制化的参数有:
fallbackMinPlaybackSpeed和fallbackMaxPlaybackSpeed: 可调整的最小和最大播放速度
proportionalControlFactor:比例控制系数,值越小,速度切换时更平滑.
直播窗口背后的异常和ERROR_CODE_BEHIND_LIVE_WINDOW
播放位置可能落后于直播窗口了,例如播放器被暂停了,或者是缓冲了太长的时间.
如果这种情况发生了,播放将失败,一个异常发生了,错误代码是
ERROR_CODE_BEHIND_LIVE_WINDOW将报告给Player.Listener.onPlayerError.
应用代码可能希望以在一个默认位置继续播放的方式,来处理这样的错误.
代码如下:
Kotlin
override fun onPlayerError(error: PlaybackException) {if (error.errorCode == PlaybackException.ERROR_CODE_BEHIND_LIVE_WINDOW) {// Re-initialize player at the live edge.player.seekToDefaultPosition()player.prepare()} else {// Handle other errors}
}