代码之家  ›  专栏  ›  技术社区  ›  Claes Zacho

Flutter video_player无法播放文件中的一些视频

  •  0
  • Claes Zacho  · 技术社区  · 4 年前

    我正在构建一个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) 全部的 视频将毫无问题地播放。 然而,重要的是,所有视频剪辑在开始时都是同时下载的。

    • 每次都是同样的片段,要么有效,要么无效,无论它们处于什么位置。

    • 我已经检查了发送到的所有路径 VideoPlayerController ,并且它们都已正确存储并与视频播放器共享。

    • 可能与这篇文章有关: Flutter video_player not playing video saved to application directory

    0 回复  |  直到 4 年前
        1
  •  1
  •   Claes Zacho    4 年前

    我解决了这个问题。 在下载过程中,我正在为每个视频剪辑下载一些元数据,其中包括其他媒体文件。出于某种原因,我为其中一些文件指定了与视频剪辑相同的保存文件路径。他们只是覆盖了每一个。由于只有一些视频剪辑在元数据中有此媒体文件,这就是导致错误仅在某些剪辑上显示的原因。