video_player 包无法在 iOS 上播放 mp4 文件,但在 Android 上

问题描述 投票:0回答:2

我正在从 Firestore 下载 mp4 文件。 然后我用 ChaceManager 确定它在缓存中。喜欢:

 dev.log(name: 'Resource_Explorer', 'Trying to chace Video: $videoName');
      final storageRef = _firebaseStorage.ref(path);
      final fileData = await storageRef.getData();
      return ExplorerFileInfo(await cacheinstance.putFile(path, fileData!, key: path), FileState.downloaded);

然后我将视频提供给我的视频播放器:

final videoFile = (await resourceExplorer.getVideoFile(videoPath)).value;

Android 上一切正常。但在 IOS 上我收到错误:
[VERBOSE-2:dart_vm_initializer.cc(41)] 未处理的异常:PlatformException(VideoError,无法加载视频:无法打开,null,null)

我搜索了错误“无法加载视频:无法打开”,发现 GitHub 问题仍处于打开状态。但只有一个人和我一样“打不开”。他们收到类似以下错误:“无法加载视频:操作已停止”。而这个问题至今仍未解决。似乎是一个 Http 错误。

我可以从我的资源中播放相同的视频。我可以执行相同的步骤在 IOS 和 Android 上显示图像。

如果有任何帮助,我将不胜感激。预先感谢!


更新:
在我使用 Duo 包而不是 .getData() 下载文件后,我能够按需要提供 mp4 文件并使用 video_player 播放它。
但是,如果我使用缓存管理器保护缓存中的数据,我将获得 .file 数据,而 video_player 无法在 iOS 上播放 .file 文件。

ios flutter video-player
2个回答
0
投票

我解决了问题。

video_player 可以在 Android 上打开“*.file”,但在 iOS 上却可以!

要解决该问题,您必须重命名视频文件,例如:

      final videoFile = (await resourceExplorer.getVideoFile(videoPath)).value;
      String videoFilePath = videoFile.path;
      String videoFilePathAsMp = '${videoFilePath.substring(0, videoFilePath.length - 4)}mp4';
      final renamedVideo = await videoFile.rename(videoFilePathAsMp);
      _vpController = VideoPlayerController.file(renamedVideo)
        ..addListener(() => setState(() {}))
        ..setLooping(true)
        ..setVolume(0.0)
        ..initialize().then((_) => _vpController!.play());

0
投票

就您而言,问题是当文件保存在缓存中时您没有设置文件扩展名。

DefaultCacheManagerputFile方法保存默认将文件扩展名设置为.file,这使得iOS无法播放视频。

解决方案是更新指定 fileExtensionputFile 方法,如下所示:

return ExplorerFileInfo(await cacheinstance.putFile(path, fileData!, key: path), FileState.downloaded, fileExtension: 'mp4');

这样您就不需要像解决方案中所述那样更新文件名。

© www.soinside.com 2019 - 2024. All rights reserved.