我有一个默认的.mp4文件,我想使用ExoPlayer(在Android上)查看。我用这个小视频:
http://techslides.com/demos/sample-videos/small.mp4
在App中,我得到一个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及更高版本。