我正在使用Exo-Player 2.x创建MPEG-DASH视频播放器,并希望在运行时更改当前视频轨道的质量。
由于Exo播放器中的最新更新,因此我无法找到相同的正确教程,因此我尝试了这些链接1,2。这是我的最终代码。
VideoPlayerActivity.kt
private fun initPlayer() {
.
.
.
val factory = PlayerTrackSelector()
trackSelector = DefaultTrackSelector(factory)
player = ExoPlayerFactory.newSimpleInstance(this, trackSelector)
player!!.addListener(object : Player.EventListener {
override fun onLoadingChanged(isLoading: Boolean) {}
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
if (playbackState == Player.STATE_READY) {
showQualitySelector(trackSelector) // this is currently for debugging purpose I will add this in button click later.
}
}
override fun onPlayerError(error: ExoPlaybackException?) {}
})
}
private fun showQualitySelector(trackSelector: DefaultTrackSelector?) {
var trackGroupArray: TrackGroupArray? = null
var groupIndex = 0
var rendererIndex = 0
val mappedTrackInfo = trackSelector!!.currentMappedTrackInfo
if (mappedTrackInfo != null) {
if (mappedTrackInfo.rendererCount != 0) {
for(i in 0 until mappedTrackInfo.rendererCount){
if(mappedTrackInfo.getTrackGroups(i) != null) {
val tempTrackGroupArray = mappedTrackInfo.getTrackGroups(i)
if (tempTrackGroupArray.length != 0 && player!!.getRendererType(i) == C.TRACK_TYPE_VIDEO) {
trackGroupArray = tempTrackGroupArray
rendererIndex = i
}
}else{
Log.d("VideoPlayerActivityTag","Null, MappedTrackInfo#getTrackGroups(int index)")
}
}
for(i in 0 until trackGroupArray!!.length){
val trackGroup = trackGroupArray.get(i)
for(j in 0 until trackGroup.length){
val format = trackGroup.getFormat(j)
Log.d("VideoPlayerActivityTag","Format = ${format.height} GroupIndex = $i TrackIndex = $j")
groupIndex = i
}
}
}else{
Log.d("VideoPlayerActivityTag","Null, MappedTrackInfo#renderCount")
}
}else{
Log.d("VideoPlayerActivityTag","Null, MappedTrackInfo")
}
overrideTrack(trackSelector,rendererIndex,groupIndex)
}
private fun overrideTrack(trackSelector: DefaultTrackSelector?,rendererIndex:Int, groupIndex:Int){
val mappedTrackInfo = trackSelector!!.currentMappedTrackInfo
val rendererTrackGroups = mappedTrackInfo?.getTrackGroups(rendererIndex)
val tracks = getTrack(rendererIndex,trackSelector)
val selectionOverride = DefaultTrackSelector.SelectionOverride(groupIndex,*tracks.toIntArray())
trackSelector.setParameters(trackSelector.buildUponParameters().setSelectionOverride(rendererIndex,rendererTrackGroups,selectionOverride))
}
private fun getTrack(rendererIndex: Int, trackSelector: DefaultTrackSelector?):ArrayList<Int>{
val mappedTrackInfo = trackSelector!!.currentMappedTrackInfo
val rendererTrackGroups = mappedTrackInfo?.getTrackGroups(rendererIndex)
val tracks = arrayListOf<Int>()
for(i in 0 until rendererTrackGroups!!.length){
val trackGroup = rendererTrackGroups.get(i)
for(j in 0 until trackGroup.length){
tracks.add(j)
}
}
return tracks
}
PlayerTrackSelector.kt
class PlayerTrackSelector : TrackSelection.Factory {
override fun createTrackSelection(
group: TrackGroup?,
bandwidthMeter: BandwidthMeter?,
vararg tracks: Int
): TrackSelection {
return AdaptiveTrackSelection(
group!!, tracks,bandwidthMeter,
AdaptiveTrackSelection.DEFAULT_MIN_DURATION_FOR_QUALITY_INCREASE_MS.toLong(),
AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS.toLong(),
AdaptiveTrackSelection.DEFAULT_MIN_DURATION_TO_RETAIN_AFTER_DISCARD_MS.toLong(),
AdaptiveTrackSelection.DEFAULT_BANDWIDTH_FRACTION,
AdaptiveTrackSelection.DEFAULT_BUFFERED_FRACTION_TO_LIVE_EDGE_FOR_QUALITY_INCREASE,
AdaptiveTrackSelection.DEFAULT_MIN_TIME_BETWEEN_BUFFER_REEVALUTATION_MS,
Clock.DEFAULT
)
}
}
我很困惑在哪里可以选择视频质量,然后将其覆盖为当前质量。