Exoplayer for android,尝试流式传输 m3u8 文件并出现错误:没有可用的提取器可以读取流
Posted
技术标签:
【中文标题】Exoplayer for android,尝试流式传输 m3u8 文件并出现错误:没有可用的提取器可以读取流【英文标题】:Exoplayer for android, trying to stream a m3u8 file and getting error: None of the available extractors could read the stream 【发布时间】:2020-06-21 23:06:39 【问题描述】:我正在尝试流式传输 m3u8 文件,但出现错误。 我使用的网址如下:http://storage.googleapis.com/videos.siku.org/10005/dash/master.m3u8 此流式视频确实可以在浏览器中使用。 我在运行时收到以下错误:
ExoPlayerImplInternal:源错误。 com.google.android.exoplayer2.source.UnrecognizedInputFormatException:没有可用的提取器(MatroskaExtractor、FragmentedMp4Extractor、Mp4Extractor、Mp3Extractor、AdtsExtractor、Ac3Extractor、TsExtractor、FlvExtractor、OggExtractor、PsExtractor、WavExtractor、AmrExtractor、Ac4Extractor、FlacExtractor)可以读取流. 在 com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractorHolder.selectExtractor(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.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) 在 java.lang.Thread.run(Thread.java:764)
我正在使用 ExoPlayerHelper 类(取自 *** 问题,尽管我确实按照推荐的方式实现了这个,但我遇到了同样的错误)
这是我正在使用的课程:
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.PlayerView,其中显示了控件。 按下播放按钮时,我收到相同的错误消息:
com.google.android.exoplayer2.ExoPlaybackException: com.google.android.exoplayer2.source.UnrecognizedInputFormatException: 没有可用的提取器(MatroskaExtractor、FragmentedMp4Extractor、Mp4Extractor、Mp3Extractor、AdtsExtractor、Ac3Extractor、TsExtractor、FlvExtractor、OggExtractor、PsExtractor , WavExtractor, AmrExtractor, Ac4Extractor, FlacExtractor) 可以读取流。
关于为什么我收到此错误 UnrecognizedInputFormatException 的任何线索?
【问题讨论】:
【参考方案1】:由于您尝试播放 m3u8 文件,您需要创建 HLS 媒体源。所以只需在下面进行更改 -
mediaSource =HlsMediaSource.Factory(DefaultHttpDataSourceFactory(userAgent))
.createMediaSource(uri)
【讨论】:
谢谢,出于某种原因,我认为 ProgressiveMediaSource 是用于 m3u8 的媒体源。它现在正在工作以上是关于Exoplayer for android,尝试流式传输 m3u8 文件并出现错误:没有可用的提取器可以读取流的主要内容,如果未能解决你的问题,请参考以下文章
ExoPlayer 无法播放 Adobe 实时流编码器流式传输的音频/视频 (RTMP)
如何在 android 中实现 Exoplayer 2.11.1?
Android TV 中的 ExoPlayer 以纵向模式而不是横向模式播放视频