android - exoplayer出错时如何跳过播放列表中的MP4视频
问题描述
我正在使用 ExoPlayer 在 Android 中播放视频。我有 3 个本地 mp4 文件并想从这些文件创建播放列表。我使用 ConcatenatingMediaSource 将所有文件添加到一个播放列表。
override fun playFromList(list: List<VideoEntity>) {
val userAgent = Util.getUserAgent(this, getString(R.string.app_name))
//2
val concatenatedSource = ConcatenatingMediaSource()
list.forEach {
if (it.localPath != null) {
val dataSourceFactory = DefaultDataSourceFactory(this, userAgent)
val extractorFactory = DefaultExtractorsFactory()
val mediaSource = ProgressiveMediaSource
.Factory(dataSourceFactory, extractorFactory)
.createMediaSource(Uri.parse(it.localPath))
concatenatedSource.addMediaSource(mediaSource)
}
exoPlayer.prepare(concatenatedSource)
}
exoPlayer.playWhenReady = true
exoPlayerView.player = exoPlayer
}
不幸的是,某些文件在播放时会产生错误并导致 exoplayer 崩溃(不播放其他视频)。
E/ExoPlayerImplInternal: Source error.
com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor, AmrExtractor, Ac4Extractor) could read the stream.
at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractorHolder.selectExtractor(ProgressiveMediaPeriod.java:1059)
at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:947)
at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:381)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
我的问题是,如何捕获该错误以便我可以跳过文件并继续播放其他文件?
谢谢
解决方案
您需要将事件侦听器添加到 exo 播放器并在那里处理错误
fun onPlayerError(error: ExoPlaybackException) {
when (error.type) {
ExoPlaybackException.TYPE_SOURCE -> Log.e(TAG, "TYPE_SOURCE: " + error.sourceException.message)
ExoPlaybackException.TYPE_RENDERER -> Log.e(TAG, "TYPE_RENDERER: " + error.rendererException.message)
ExoPlaybackException.TYPE_UNEXPECTED -> Log.e(TAG, "TYPE_UNEXPECTED: " + error.unexpectedException.message)
}
}
推荐阅读
- android - Android Studio 中是否有模板来创建使用 kotlin 而不是 Groovy 的项目?
- c# - Microsoft Identity Framework 将角色分配给 Postgres 数据库的用户错误 - 已处理 CancellationTokenSource
- swift - JSONDecoder 无法解析地图列表
- vue.js - Vue - 另一个表单内的表单并提交事件触发器
- python - 基于图的 CNN 的数据准备(类似 Cora)
- angular - Jest 遇到了一个意外的令牌 - 导出 dnd-core angular-skyhook
- jenkins - 使用 groovy 脚本在活动选择参数中获取视图中的所有作业
- java - 如何确保在 mysql 容器启动并在 docker-compose 中运行后构建 Web 映像?
- python - 使用 Exchangelib 过滤器过滤特定域的电子邮件
- c# - System.Reactive:Timestamp 字段的基于时间的缓冲区