如何在 Flutter 中播放视频列表?

How to play a List of video in Flutter?

我正在使用 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();
  }
}

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

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

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

最近测试了视频列表示例。请检查 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(() {});
    });
}