当前位置: 首页 > 知识库问答 >
问题:

回收视图中的Exoplayer错误,源错误没有可用的提取器

费星晖
2023-03-14

我正在使用ExoPlayer流视频中的回收视图。

我正在ViewHolder中的RecyclerView适配器的绑定方法中实现ExoPlayer。

我使用的视频格式是m3u8,我使用的URL在浏览器中工作。所以我知道视频链接是有效的。我还测试了一个youtube链接。

以下是Recyclerview适配器的ViewHolder中的代码-

class ViewHolder private constructor(val binding: FeedRowBinding) :
    RecyclerView.ViewHolder(binding.root) {

    fun bind(context: Activity){
        if (entity.content.videolink != null) {
            setupVideoPlayer(entity.content.videolink, context)
        }
    }
}

private fun setupVideoPlayer(url: String, context: Activity) {
    val videoExoPlayer = SimpleExoPlayer.Builder(binding.videoView.context).build()
    videoExoPlayer.prepare(createUrlMediaSource(url, context))

    binding.play.setOnClickListener {
        videoExoPlayer.playWhenReady = true
    }

    binding.pause.setOnClickListener {
        videoExoPlayer.playWhenReady = false
    }
}

private fun createUrlMediaSource(url: String, context: Activity): MediaSource {
    val userAgent = Util.getUserAgent(context, context.getString(R.string.about))
    return ProgressiveMediaSource
           .Factory(DefaultDataSourceFactory(context, userAgent), DefaultExtractorsFactory())
           .createMediaSource(Uri.parse(url))
}

当加载我的recyclerview并带着视频进入该行时,我发现以下错误:

com.google.android.exoplayer2.source.无法识别的InputFormat异常:没有一个可用的提取器(MatroskaExtrator,FragmentedMp4Extrator,Mp4Extrator,Mp3Extrator,AdtsExtrator,Ac3Extrator,TsExtrator,FlvExtrator,OggExtrator,PsExtrator,WavExtrator,AmrExtrator,Ac4Extrator,FlacExtrator)可以读取流。在com.google.android.exoplayer2.source.ProgressiveMedia期限$ExtratorHolder.select提取器(ProgressiveMediaPeriod.java:1090)在com.google.android.exoplayer2.source.ProgressiveMedia期限$提取Loadable.load(ProgressiveMediaPeriod.java:969)在com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)在java.util.concurrent.ThreadPoolExecator$Worker.run(ThreadPoolExecutor.java:636)在java.lang.Thread.run(Thread.java:764)

我不确定我做错了什么,关于如何解决这个问题有什么想法吗?

共有3个答案

柴博
2023-03-14

在Android 4.1上,您可以https://github.com/brianwernick/ExoMedia/使用这个库。阅读页面上提到的示例应该足以让您开始。我已经复制了该代码片段,并添加/修改了一些内容。

private void setupVideoView() {
            EMVideoView emVideoView = (EMVideoView)findViewById(R.id.video_play_activity_video_view);
            emVideoView.setOnPreparedListener(this);

            //Enter your m3u8 URL below
            emVideoView.setVideoURI(Uri.parse("http://SOMESERVER/playlist.m3u8"));
        }

        @Override
        public void onPrepared(MediaPlayer mp) {
            //Starts the video playback as soon as it is ready
            emVideoView.start();
        }

        @Override
        public void onPause() {
            super.onPause();
            //Pause Video Playback
            emVideoView.pause();
        }
陶星波
2023-03-14

我不认为m3u8是一种视频格式,而是一种播放列表格式。我认为Exoplayer比处理播放列表更低级别;可能你需要自己阅读m3u8文件,然后自己传入播放列表中的链接。

幸运的是,文件格式并不复杂,解析起来也不太困难。似乎有很好的记录。维基百科上甚至有一些例子:https://en.wikipedia.org/wiki/M3U

微生曾琪
2023-03-14

您需要修改createUrlMediaSource

private fun createUrlMediaSource(url: String, context: Activity): MediaSource {
    val userAgent = Util.getUserAgent(context, context.getString(R.string.about))
    return ProgressiveMediaSource
           .Factory(DefaultDataSourceFactory(context, userAgent), DefaultExtractorsFactory())
           .createMediaSource(Uri.parse(url))
}

如中所述https://exoplayer.dev

  • DashMediaSource用于DASH

因此,您需要将函数替换为:

private fun createUrlMediaSource(url: String, context: Activity): MediaSource {
    val userAgent = Util.getUserAgent(context, context.getString(R.string.about))
    return HlsMediaSource
           .Factory(DefaultDataSourceFactory(context, userAgent), DefaultExtractorsFactory())
           .createMediaSource(Uri.parse(url))
}
 类似资料:
  • 在遵循《开发者指南》中给出的示例之后,我得到了以下信息: 设置: 布局: 完整日志: 网址肯定有效(我已经尝试了其他几个)。我错过了什么? 更新: 当我在本地加载视频时,播放器确实工作了。不过这并不能解决我的问题。

  • 这个应用程序直接从应用编程接口获取数据。当它运行时,会发生这种类型的错误。基本上,我认为错误发生在getItemCount()方法中,但我无法解决这个问题。我已经附上了错误文件和整个代码。如果你能解决这个错误,我将不胜感激。 JAVAlang.NullPointerException:尝试调用接口方法“int java”。util。列表com上的空对象引用上的size()。techbrightso

  • 我从Web API服务中获取数据,来自反应原生ios项目,我收到了这条消息 RCTURLRequestHandlers RCTDataRequestHandler:0x7a11c0e0和RCTImageStoreManager:0x7a6c46a0都报告它们可以处理请求NSURLRequest:0x7a28bb10{URL:%0D%0A%0D%0Ahttps://webApiURL/post1.p

  • 我在recyclerView中遇到错误// 数据类类别( )这是模型///// 对象类别模型{ ////适配器/// 类CategoriesAdapter(private val itemList:ArrayList):RecyclerView。适配器 .充气(R.layout.memmals,parent,false)返回ViewHolder(视图) }/////主要活动/// 类MainAct

  • 我有一些关于适配器的问题,这是我的方法: 另一个Java:1。名单。Java }

  • 在最近升级了我的android工作室后,我不能再构建我的项目了。 重建、清理项目和使缓存无效都不起作用! 添加android.enableaapt2=false行并不能解决真正的问题,因此我宁愿找到问题的根源。 下面显示了我的gradle.build文件: