首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >exoplayer出错时如何跳过播放列表中的MP4视频

exoplayer出错时如何跳过播放列表中的MP4视频
EN

Stack Overflow用户
提问于 2019-07-01 15:41:30
回答 1查看 836关注 0票数 2

我正在使用ExoPlayer在安卓系统中播放视频。我有3个本地mp4文件,并想从这些文件创建播放列表。我正在使用ConcatenatingMediaSource将所有文件添加到一个播放列表中。

代码语言:javascript
运行
复制
    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崩溃(不能播放其他视频)。

代码语言:javascript
运行
复制
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)

我的问题是,如何捕获该错误,以便我可以跳过该文件并继续播放其他文件?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-07-01 17:24:22

您需要将事件侦听器添加到exo播放器并在那里处理错误。

代码语言:javascript
运行
复制
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)
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56831736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档