Flutter video_player 无法播放文件中的一些视频
Flutter video_player unable to play a few videos from file
我正在构建一个 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% 的剪辑将加载并完美播放,而其他剪辑将 return 在日志中出现以下错误:
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
的所有路径,它们都已正确存储并与视频播放器共享。
可能与此有关post:Flutter video_player not playing video saved to application directory
我想通了这个问题。
在下载过程中,我正在为每个视频剪辑下载一些元数据,其中包括其他媒体文件。出于某种原因,我为其中一些文件指定了与视频剪辑相同的保存文件路径。他们只是简单地覆盖了每一个。由于只有部分视频剪辑在元数据中包含此媒体文件,这就是导致错误仅显示在某些剪辑上的原因。
我正在构建一个 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% 的剪辑将加载并完美播放,而其他剪辑将 return 在日志中出现以下错误:
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
的所有路径,它们都已正确存储并与视频播放器共享。可能与此有关post:Flutter video_player not playing video saved to application directory
我想通了这个问题。 在下载过程中,我正在为每个视频剪辑下载一些元数据,其中包括其他媒体文件。出于某种原因,我为其中一些文件指定了与视频剪辑相同的保存文件路径。他们只是简单地覆盖了每一个。由于只有部分视频剪辑在元数据中包含此媒体文件,这就是导致错误仅显示在某些剪辑上的原因。