android - 如何解决返回 null 的 DefaultTrackSelector#getCurrentMappedTrackInfo?
问题描述
我正在使用 Exoplayer 版本2.7.2
,我想迭代MappedTrackInfo
以获取所有可用TrackGroupArray
的 DASH 视频。但是 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
解决方案
您需要添加并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
}
}
推荐阅读
- javascript - 如何在后端以自动方式录制 HTML 动画并将其保存为视频
- java - mvn test 不在springboot项目中运行单元测试
- css - React Material UI Box 文本超出了 div
- java - 基于JAVA8的应用程序上GC分配失败的解决方案
- azure-devops - 邀请(外部)人员参加他们的第一个项目时,Azure DevOps 不发送邀请邮件
- reactjs - 如何在 MDB 数据表 React js 中添加下载功能
- c - C文件优化
- autofac - 使用 autofac 根据上下文将构造函数值传递给相同的实现参数
- c - 存在 unicode 字符时的 %s 最小字段宽度
- go - 无法导入 gorilla/mux(github.com/gorilla/mux@v1.7.4:在 go.mod 中明确要求,但在 vendor/modules.txt 中未标记为明确)