【问题标题】:How to resolve DefaultTrackSelector#getCurrentMappedTrackInfo returning null?如何解决返回 null 的 DefaultTrackSelector#getCurrentMappedTrackInfo?
【发布时间】:2020-02-06 13:31:59
【问题描述】:

我正在使用 Exoplayer 版本 2.7.2,我想迭代 MappedTrackInfo 以获取 DASH 视频的所有可用 TrackGroupArray。但是 DefaultTrackSelector#getCurrentMappedTrackInfo 返回 null。

这是我的代码:

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
        )
    }
}

MainActivity.kt

 logTracks(DefualtTrackSelector(PlayerTrackSelector())) // This is called after Player#prepare

 private fun logTracks(trackSelector: DefaultTrackSelector?) {
    var trackGroupArray: TrackGroupArray? = null

    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
                        }
                    } else {
                        Log.d(TAG, "Null, MappedTrackInfo#getTrackGroups(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(TAG,"Height = ${format.height} GroupIndex = $i TrackIndex = $j")
                    }
                }
            } else {
                Log.d(TAG, "Empty, MappedTrackInfo#renderCount")
            }
        }else{
            Log.d(TAG, "Null, MappedTrackInfo") //This is what shows in logcat.
        }
}

我也尝试过使用不同的 MPD。

信息:

1) 依赖关系:

实现 'com.google.android.exoplayer:exoplayer:2.7.2'
实施 'com.google.android.exoplayer:exoplayer-core:2.10.5'
实施 'com.google.android.exoplayer:exoplayer-dash:2.10.5'
实施 'com.google.android.exoplayer:exoplayer-ui:2.10.5'

2) 网址:https://s3.amazonaws.com/_bc_dml/example-content/sintel_dash/sintel_vod.mpd

【问题讨论】:

  • 看看我更新的答案;)
  • 在您致电getCurrentMappedTrackInfo() 时播放器可能还没有准备好。例如,对播放器中的按钮进行 onClick 调用对我有用。

标签: android kotlin mpeg-dash exoplayer2.x


【解决方案1】:

您需要添加Player.EventListener 并等待playbackState 位于Player.STATE_READY

private val eventListener: Player.EventListener = object : Player.EventListener {
        override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
            if (playbackState == Player.STATE_READY) {
                // look for MappedTrackInfo
            }
        }

【讨论】:

  • 对我不起作用仍然为空
  • 你好,一年过去了,你用的是什么exoplayer版本?
猜你喜欢
  • 2020-01-28
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 2016-07-14
相关资源
最近更新 更多