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

Flutter video_player多视频播放引发内存溢出问题求助

多视频播放内存溢出问题解决方案

问题诊断

内存溢出的核心原因是同时持有多个未销毁的VideoPlayerController实例——即使视频暂停,控制器仍会占用解码内存、网络缓存等资源,当实例数量累积到3-4个以上时,就会触发内存不足。


具体优化方案

1. 完全销毁不可见视频的控制器

仅暂停视频无法释放底层资源,必须在视频完全不可见时调用dispose()销毁控制器,并清空引用,避免内存泄漏。修改可见性监听逻辑:

VisibilityDetector(
  key: Key(index.toString()),
  onVisibilityChanged: (info) async {
    final fluUI = state.flus![index];
    if (!fluUI.flu!.images!.first.isVideo!) return;

    if (info.visibleFraction < 0.1) {
      // 完全不可见时销毁控制器并清空引用
      await fluUI.controller?.dispose();
      state.flus![index].controller = null;
    } else if (info.visibleFraction >= 0.5) {
      // 可见时,若控制器已销毁则重新初始化
      if (fluUI.controller == null) {
        final cont = VideoPlayerController.networkUrl(
          Uri.parse(URIS.googleStorageBucket +
              Uri.encodeComponent(fluUI.flu!.images!.first.contentUrl!) +
              URIS.mediaQuery),
          videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true),
        );
        await cont.initialize();
        state.flus![index].controller = cont;
        cont.play();
      } else {
        fluUI.controller?.play();
      }
    } else {
      // 部分可见时仅暂停(可根据需求调整销毁逻辑)
      fluUI.controller?.pause();
    }
  },
  child: VideoPlayer(state.flus![index].controller!), // 注意此处应为VideoPlayer组件,而非控制器
)

2. 限制同时播放的视频数量

参考Instagram的逻辑,仅允许当前视窗中心区域的1-2个视频保持播放状态,其他视频即使部分可见也强制暂停并销毁控制器。可结合滚动监听+可见性检测实现精准控制。

3. 优化控制器生命周期管理

不要将VideoPlayerController长期存放在FluUIModel中,建议将控制器的创建/销毁逻辑绑定到Widget的生命周期(如State的initState/dispose),或使用状态管理工具(Provider/Riverpod)统一管理,避免无意识的内存持有。

4. 调整视频播放配置

  • 禁用不必要的mixWithOthers:如果不需要后台多视频播放,将其设为false,减少音频解码资源占用。
  • 降低视频分辨率:通过Google Storage的URL参数(如?w=480)请求低分辨率视频,直接减少解码内存消耗。

额外注意事项

  • 添加防抖逻辑:在列表滚动时延迟500ms再处理可见性变化,避免频繁创建/销毁控制器引发的资源波动。
  • 内存泄漏排查:使用Flutter DevTools的内存分析工具,确认控制器实例是否被正确回收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:50:15