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

用于android的Exoplayer,尝试流式传输m3u8文件时出错:没有可用的提取器可以读取流

宫元徽
2023-03-14

我试图传输一个m3u8文件,但出现了一个错误。我使用的url如下:http://storage.googleapis.com/videos.siku.org/10005/dash/master.m3u8这种流式视频在浏览器中也能正常工作。我在运行时遇到以下错误:

ExoPlayerImplInternal:源错误。com.google.android.exoplayer2.source。无法识别的输入格式异常:任何可用的提取器(MatroskaExtractor、FragmentedMp4Extractor、Mp4Extractor、Mp3Extractor、AdtsExtractor、Ac3Extractor、TsExtractor、FLVEExtractor、OGGEExtractor、PsExtractor、WaveExtractor、AmrExtractor、Ac4Extractor、FlaceExtractor)都无法读取流。位于com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractorHolder.selectextrator(ProgressiveMediaPeriod.java:1090)位于com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:969)位于com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:391)位于java.util.concurrent.threadpoolex(ThreadPoolExecutor.java:1162)在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)在java.lang.Thread.run(Thread.java:764)

我使用的是ExoPlayerHelper类(它来自一个stackoverflow问题,尽管我确实以推荐的方式实现了它,但我也遇到了同样的错误)

这是我正在使用的类:

class ExoPlayerHelper(
    private val playerView: PlayerView,
    onError: (ExoPlaybackException) -> Unit,
    onPlayerBuffer: (Boolean) -> Unit
) {
    private var exoPlayer: ExoPlayer? = null
    private var mediaSource: ProgressiveMediaSource? = null
    private val playerListener = object : Player.EventListener {
        override fun onPlayerError(error: ExoPlaybackException) {
            super.onPlayerError(error)
            onError(error)
        }

        override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
            super.onPlayerStateChanged(playWhenReady, playbackState)
            onPlayerBuffer(playbackState == Player.STATE_BUFFERING)
        }
    }

    fun initializePlayer(url: String) {
        exoPlayer = SimpleExoPlayer.Builder(playerView.context).build()
        exoPlayer!!.repeatMode = Player.REPEAT_MODE_ALL
        exoPlayer!!.addListener(playerListener)
        playerView.player = exoPlayer

        val userAgent =
            Util.getUserAgent(playerView.context, playerView.context.getString(R.string.app_name))
        mediaSource = ProgressiveMediaSource
            .Factory(
                DefaultDataSourceFactory(playerView.context, userAgent),
                DefaultExtractorsFactory()
            )
            .createMediaSource(Uri.parse(url))
            exoPlayer!!.prepare(mediaSource!!, true, false)
            exoPlayer!!.playWhenReady = true
        }
    }
}

我确实得到了一个空白的com.google.android.exoplayer2.ui。播放视图,显示控件。按下播放按钮时,我收到相同的错误消息:

com.google.android.exoplayer2.ExoPlaybackException:com.google.android.exoplayer2.source。无法识别的输入格式异常:任何可用的提取器(MatroskaExtractor、FragmentedMp4Extractor、Mp4Extractor、Mp3Extractor、AdtsExtractor、Ac3Extractor、TsExtractor、FLVEExtractor、OGGEExtractor、PsExtractor、WaveExtractor、AmrExtractor、Ac4Extractor、FlaceExtractor)都无法读取流。

有什么线索可以解释为什么我会遇到这个错误UnrecognedInputFormatException?

共有2个答案

凌嘉勋
2023-03-14

使用此方法必须使用HlsMediaSource

 Uri uri = Uri.parse(urlStream);
 //MediaSource mediaSource = buildMediaSource(uri);
 DataSource.Factory dataSourceFactory =
         new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "app-name"));
 HlsMediaSource hlsMediaSource =
         new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(uri);
 player = ExoPlayerFactory.newSimpleInstance(this);
 player.setPlayWhenReady(playWhenReady);
 player.seekTo(currentWindow, playbackPosition);

 // Create a player instance.

 // Prepare the player with the media source.
 //player.prepare(mediaSource);
 player.prepare(hlsMediaSource, false, false);
漆雕稳
2023-03-14

由于您正在尝试播放m3u8文件,因此您需要创建HLS传媒资源。所以只需进行以下更改-

mediaSource =HlsMediaSource.Factory(DefaultHttpDataSourceFactory(userAgent))
                .createMediaSource(uri)
 类似资料:
  • 在android中,有一个名为Exoplayer的库,它与从给定URL流媒体视频有关。 根据这一点,firebase不支持视频流,尽管您可以将uri从url传递到videoview(它实际上会流)。 问题:

  • 我正在使用ExoPlayer流视频中的回收视图。 我正在ViewHolder中的RecyclerView适配器的绑定方法中实现ExoPlayer。 我使用的视频格式是m3u8,我使用的URL在浏览器中工作。所以我知道视频链接是有效的。我还测试了一个youtube链接。 以下是Recyclerview适配器的ViewHolder中的代码- 当加载我的recyclerview并带着视频进入该行时,我发

  • 我试图读取xsd文件以验证模式。 我的架构位于位置 我的类读取这个文件也在< code > x/y/z/read schema . Java 中 它们都装在我的罐子里。 我试图在中读取这个文件,如下所示,其中名称是但url返回为null? 我做错什么了吗?

  • Android应用程序经常崩溃,以下是logcat的日志。

  • 我收到一个错误值error:对关闭的文件执行I/O操作。当使用下面的代码时,我的其余代码似乎工作正常,有什么想法吗?

  • 我在apache Spark中读取本地文件时出错。scala>val f=sc.textfile(“/home/cloudera/downloads/sample.txt”)