Как изменить качество видео в Exo-плеере 2.x? - PullRequest
0 голосов
/ 02 ноября 2019

Я создаю видеоплеер MPEG-DASH с помощью Exo-Player 2.x и хочу изменить качество текущей видеодорожки во время выполнения.

Из-за недавних обновлений в Exo-player я не являюсьудалось найти подходящий учебник для того же, поэтому я попробовал эти ссылки 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
    )
}
}

Яперепутал где опция, в которой я могу выбрать качество видео и затем переопределить его к текущему качеству.

...