android - UnrecognizedInputFormatException:没有可用的提取器可以读取流
问题描述
我有一个要使用 ExoPlayer(在 Android 上)查看的默认 .mp4 文件。我用这个小视频:
http://techslides.com/demos/sample-videos/small.mp4
在应用程序中,我得到一个 base64 字符串,即视频。当我在本网站粘贴上述视频时:
https://base64.guru/converter/encode/video
它显示的 Base64 值与应用程序中接收到的值相同,但是会引发以下错误。
player.playFromBytes(currentVideoBase64?.toByteArray()!!)
override fun playFromBytes(byteArray: ByteArray) {
val mediaSource = createMediaSourceFromByteArray(byteArray)
exoPlayer.prepare(mediaSource)
exoPlayer.playWhenReady = true
}
private fun createMediaSourceFromByteArray(data: ByteArray): MediaSource {
val byteArrayDataSource = ByteArrayDataSource(data)
val factory = DataSource.Factory { byteArrayDataSource }
val mediaSource = ProgressiveMediaSource.Factory(factory, DefaultExtractorsFactory())
.createMediaSource(Uri.EMPTY)
return Objects.requireNonNull(mediaSource, "MediaSource cannot be null")
}
错误信息:
2019-09-18 18:09:59.970 18009-18743/ 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)
更新:使用Base64.getDecoder().decode(currentVideoBase64)
它有效,但仅适用于 Android O 及更高版本。
解决方案
推荐阅读
- angular - 在子模块中访问路由 ID
- python - While 循环正确轮询 json 响应 api
- angular - Elementor wordpress + React 或 Angular
- maven - 如何在 jenkins 中重新运行 cucumber-jvm 失败的测试用例
- devops - GIT中用于将现有更改文件提升到远程分支的命令序列应该是什么
- javascript - 如何将自定义 HTML 添加到 ngx Typeahead?
- azure - 启用创建资源组的功能
- r - R data.frame 到嵌套命名列表:colnames -> rownames -> JSON 转换的值
- python - 如何在python中更改列表中的设置值
- bash - 在 macOS 上将特定类型的文件添加到文件夹 A 时,自动将它们从文件夹 A 移动到 B