【问题标题】:How to play a List of video in Flutter?如何在 Flutter 中播放视频列表?
【发布时间】:2019-08-23 07:07:58
【问题描述】:

我正在使用 flutter video_player 包播放视频列表。

List sourceList;

sourceList = [
  {
    "size": 69742504,
    "name": "lucky-roulette.mp4",
    "mimetype": "video/mp4",
  },
  {
    "size": 69742504,
    "name": "BigBuckBunny.mp4",
    "mimetype": "video/mp4",
  }
];

我查看了this issue,并对其进行了一些自定义代码。

void play() {
  log.fine("Now playing: $_nowPlayingUrl");
  _adController = VideoPlayerController.network(_nowPlayingUrl);
  _adController.initialize().then((_) => setState(() {}));
  _adController.play();
  _adController.addListener(checkIfVideoFinished);
}

void checkIfVideoFinished() {
  if (_adController == null ||
      _adController.value == null ||
      _adController.value.position == null ||
      _adController.value.duration == null) return;
  if (_adController.value.position.inSeconds ==
      _adController.value.duration.inSeconds) {
    _adController.removeListener(checkIfVideoFinished);
    _adController.dispose();
    // Change _nowPlayingIndex
    setState(() {
      _nowPlayingIndex = (_nowPlayingIndex + 1) % _totalIndex;
    });
    play();
  }
}

但是使用这段代码 sn-p 会发出异常Another exception was thrown: A VideoPlayerController was used after being disposed.

有没有更好的方法在 Flutter 中播放和循环播放视频列表?

【问题讨论】:

  • 最佳答案应该是,这不是我的,但在 2 个颤振项目中使用并且运行良好 stackoverflow.com/a/58959097/10329023 特别感谢 @igor-kharakhordin 帮助他人和快乐编码:)

标签: video dart flutter video-player


【解决方案1】:

您必须在 Override dispose 方法中调用视频控制器的 dispose 方法。 removevideo时不需要调用dispose方法。

【讨论】:

    【解决方案2】:

    最近我测试了视频列表示例。请在 github FlutterVideoListSample 中查看源代码。我认为必须处置视频小部件。

    在我的例子中,我在初始化之前清除了旧的 VideoPlayerController。而且我不使用chewie 插件在进入全屏时创建新页面,因此无法处理下一个视频小部件。

    依赖关系
    video_player: '>=0.10.11+1 <2.0.0'
    
    FlutterVideoListSample 中的一些代码
    VideoPlayerController _controller;
    
    void _initializeAndPlay(int index) async {
      print("_initializeAndPlay ---------> $index");
      final clip = _clips[index];
      final controller = VideoPlayerController.asset(clip.videoPath());
      final old = _controller;
      if (old != null) {
        old.removeListener(_onControllerUpdated);
        old.pause(); // mute instantly
      }
      _controller = controller;
      setState(() {
        debugPrint("---- controller changed");
      });
    
      controller
        ..initialize().then((_) {
          debugPrint("---- controller initialized");
          old?.dispose();
          _playingIndex = index;
          controller.addListener(_onControllerUpdated);
          controller.play();
          setState(() {});
        });
    }
    

    【讨论】:

    • 初始化视频需要多长时间?我正在使用“videoPlayerController.value.initialized”来检查视频是否已初始化……有时初始化视频需要 10 秒。
    • 我花了不到 1 秒。我不知道为什么您的视频需要很长时间才能初始化。但是,我使用了 4 分钟以下的 720x480 短视频。并且以 1 秒间隔关键帧渲染的视频。 @Soropromo
    • 嗨@BrownsooHan。我复制并粘贴了您的代码,在播放视频 5 次后,抛出此 异常:com.google.android.exoplayer2.ExoPlaybackException: com.google.android.exoplayer2.audio.AudioSink$InitializationException: AudioTrack init failed: 0, Config(48000, 12, 49248) 我用的是 Pixel C
    • 嗨,@SamiIssa,我只在 iOS 中使用过这段代码。在 _clearPrevious() 中尝试 _controller?.dispose();。我会在android中尝试这个。如果我也遇到或解决了该问题,请更新此帖子。如果您找到解决方案,请回复解决方案。
    • @SamiIssa :我同意..我现在已经被推送到 prod 的应用程序面临这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2020-06-12
    • 2019-10-08
    • 2019-11-10
    • 2021-10-19
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多