You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter video_player iOS端视频重启失败问题求助

关于Flutter video_player iOS端视频重启冻结问题的解答

1. 这是video_player插件iOS端的已知问题吗?

是。在video_player 2.x系列(包括你使用的2.9.2版本)的iOS实现中,确实存在视频播放完成后调用seekTo(Duration.zero)再play()导致画面冻结的问题。这是因为底层AVPlayer在播放结束后,内部状态没有正确响应seek操作,导致播放指令无法触发画面刷新,该问题在后续的3.x版本中已被官方修复。

2. 控制器的使用方式是否正确?

你的代码逻辑本身没有问题:判断视频完成后重置进度再播放的流程,在Android和Web平台能正常运行就说明逻辑是合理的。问题出在iOS端插件的底层实现缺陷,而非你的使用方式错误。

3. 已知的解决方案或规避方法

方案一:升级video_player到最新稳定版

直接将插件版本升级到3.x及以上(目前最新稳定版已修复该iOS端问题),修改pubspec.yaml中的依赖:

dependencies:
  video_player: ^3.10.0 # 替换为最新稳定版

执行flutter pub get后重新编译iOS项目,即可解决该问题。

方案二:临时规避(不升级版本时)

如果暂时无法升级插件,可以调整代码逻辑,在seek前先暂停控制器,确保底层AVPlayer状态重置:

Future<void> _playHandler(PlayVideo event, Emitter<VideoPlayerState> emit) async {
  try {
    if (_controller != null) {
      Logger.instance.i(logKey, '[play] called.');
      
      // Restart the video if it has completed
      if (_controller!.value.isCompleted) {
        Logger.instance.i(logKey, 'Video is completed. Restarting...');
        // 先暂停,再重置进度,最后播放
        await _controller!.pause();
        await _controller!.seekTo(Duration.zero);
        Logger.instance.i(logKey, 'Video reset to start position.');
      }

      // Play the video
      await _controller!.play();
      Logger.instance.i(logKey, '[play] sent to platform.');
    } else {
      Logger.instance.w(logKey, 'Controller is not ready.');
    }
  } catch (e, s) {
    Logger.instance.e(logKey, 'Failed to play video.', error: e, stackTrace: s);
  }
}

另外也可以尝试在seekTo后等待100毫秒左右再调用play(),不过这种方式的稳定性不如先暂停的方案。


内容的提问来源于stack exchange,提问作者Maquinho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 00:22:41