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
相关产品推荐
相关产品推荐

