【发布时间】:2020-09-18 10:36:40
【问题描述】:
我正在构建一个 Flutter 应用程序,该应用程序从 Firebase 获取视频剪辑 URL 列表,将它们下载到存储并存储文件路径。之后,用户可以浏览视频路径列表并播放已下载的视频片段。这是通过 Flutter video_player 完成的。
问题
这应该很简单,但由于某种原因,某些视频剪辑无法由 VideoPlayerController 加载和播放。 所有视频剪辑的格式完全相同,以相同的方式渲染、压缩和上传。
每个视频片段都会像这样下载到存储中:
var dir = await getApplicationDocumentsDirectory();
String filePath = "video/$index.mp4";
String fullPath = dir.path + filePath;
Response videoResponse = await dio.download(videoUrl, fullPath);
if (videoResponse.statusCode == 200) {
videoPath = fullPath;
print("Downloaded: $filePath");
} else {
print("Download error")
}
videoPath随后将存储在一个列表中并发送包含视频播放器的屏幕。
在视频播放器屏幕中,它会从文件中加载视频片段:
_controller = VideoPlayerController.file(
new File(videos[index].videoPath));
_initPlayerFuture = _controller.initialize();
此代码将使用index 在列表中的每个文件之间进行切换。
当我运行它时,大约 50% 的剪辑将加载并完美播放,而其他剪辑将在日志中返回以下错误:
E/ExoPlayerImplInternal(27253): Source error.
E/ExoPlayerImplInternal(27253): com.google.android.exoplayer2.source.UnrecognizedInputFormatException: None of the available extractors (MatroskaExtractor, FragmentedMp4Extractor, Mp4Extractor, Mp3Extractor, AdtsExtractor, Ac3Extractor, TsExtractor, FlvExtractor, OggExtractor, PsExtractor, WavExtractor, AmrExtractor) could read the stream.
E/ExoPlayerImplInternal(27253): at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractorHolder.selectExtractor(ExtractorMediaPeriod.java:973)
E/ExoPlayerImplInternal(27253): at com.google.android.exoplayer2.source.ExtractorMediaPeriod$ExtractingLoadable.load(ExtractorMediaPeriod.java:891)
E/ExoPlayerImplInternal(27253): at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:381)
E/ExoPlayerImplInternal(27253): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/ExoPlayerImplInternal(27253): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/ExoPlayerImplInternal(27253): at java.lang.Thread.run(Thread.java:764)
我似乎已将问题与我将视频剪辑保存到存储的方式隔离开来(请参阅注释),但这并不能解释为什么有些剪辑可以工作而其他剪辑不能。
有人知道可能发生了什么,以及如何解决吗?或者有没有人遇到过同样的问题,并且可能有一些经验可以分享?
提前致谢!
注意事项
-
只要我跳过下载到存储过程,只需使用
VideoPlayerController.network(videos[index].videoUrl)all,视频就会毫无问题地播放。 重要的是,所有的视频剪辑都是在开始时同时下载的。 -
每次工作或不工作的剪辑都是相同的,它们进入的位置无关紧要。
-
我检查了发送到
VideoPlayerController的所有路径,它们都已正确存储并与视频播放器共享。 -
可能与这篇文章有关:Flutter video_player not playing video saved to application directory
【问题讨论】:
-
VideoPlayerController.network() 也适用于本地视频,这可行
-
@jitsm555 将文件路径传递给 VideoPlayerController.network() 并没有改变任何东西,遗憾的是。它仍然会在一些剪辑上产生错误,而在其他剪辑上完美播放。
-
每个视频文件的扩展名是一样的还是不同的
-
@jitsm555 是的,都是mp4的
标签: android firebase flutter exoplayer2.x flutter-video-player