uni-app video 组件长时间播放mp4视频连播一两天会导致app内存泄漏一直涨最终崩溃

发布于 1周前 作者 yibo5220 来自 Uni-App

uni-app video 组件长时间播放mp4视频连播一两天会导致app内存泄漏一直涨最终崩溃

项目信息 详情
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 22631.4460
HBuilderX类型 正式
HBuilderX版本号 4.29
手机系统 Android
手机系统版本号 Android 11
手机厂商 海信电视
手机机型 海信电视
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

示例代码:

<view class="content">  
<!--视频-->  
<video id="myVideo"  
v-if="(MediaType == 1)"  
object-fit='contain'  
style="width: 100%;height: 100vh;"  
src="itemSrc"
       @error="videoErrorCallback"
       @ended="videoEndCallback"  
controls="false"
show-center-play-btn="false">
</video>  

<!--图片-->
<view v-if="(MediaType == 2)" style="height: 100vh;width: 100%;">
<image style="width: 100%; height: 100vh;background: black" mode="aspectFit" :src="itemSrc"
@error="imageError"></image>
</view>  

<!-- 空状态     -->
<view v-if="!itemSrc" style="font-weight: bold;font-size: 46px;height: 100vh;width:100%;display: flex;align-items: center;justify-content: center;">
<text>为空</text>
</view>  
</view>

操作步骤:

  • 每次长时间播放视频即可复现

预期结果:

  • 内存处于稳定水平,不会一直连续增长

实际结果:

  • 页面视图v-if切换过程中,视频组件播放高清mp4 内存一直增长,最后导致app崩溃,app重启有时再次卡住。

bug描述:

  • 页面视图在图片和视频之间频繁切换(大致一分钟一次切换),video 组件长时间播放mp4视频,连播一两天,app会内存泄漏,一直涨,导致app崩溃,期间有图片和视频组件的v-if 显隐切换,代码如下

1 回复

在处理uni-app中video组件长时间播放MP4视频导致内存泄漏的问题时,通常涉及到对视频组件的生命周期管理、内存清理以及可能的第三方库或框架的bug处理。以下是一些可能的解决方案,主要通过代码示例来展示如何处理这些问题。

1. 监听视频结束事件并重置组件

确保在视频播放结束后,及时重置video组件的状态,避免内存泄漏。

<template>
  <view>
    <video
      id="myVideo"
      src="path/to/your/video.mp4"
      @ended="onVideoEnded"
      ref="videoPlayer"
    ></video>
  </view>
</template>

<script>
export default {
  methods: {
    onVideoEnded() {
      // 重置video组件
      this.$refs.videoPlayer.pause();
      this.$refs.videoPlayer.currentTime = 0;
      // 如果需要,可以动态移除并重新创建video组件
      // this.$forceUpdate(); // 极端情况下,强制组件重新渲染
    },
  },
};
</script>

2. 使用Web API手动管理内存

在某些情况下,可以使用JavaScript的Web API如Window.performance.memory来监控内存使用情况,虽然这不能直接解决内存泄漏,但可以帮助诊断问题。

if (performance && performance.memory) {
  console.log(`Used JS Heap Size: ${performance.memory.usedJSHeapSize}`);
  console.log(`JS Heap Size Limit: ${performance.memory.jsHeapSizeLimit}`);
}

3. 定期清理和释放资源

在长时间播放的情况下,定期暂停并重新加载视频,或者重启应用以释放内存。

setInterval(() => {
  const video = this.$refs.videoPlayer;
  if (video) {
    video.pause();
    video.src = ''; // 清空src属性,释放视频资源
    video.src = 'path/to/your/video.mp4'; // 重新设置src,如果需要继续播放
    video.play();
  }
}, 86400000); // 每天清理一次,时间间隔可根据需要调整

4. 更新uni-app和依赖库

确保你使用的uni-app框架和所有依赖库都是最新版本,因为新版本可能已经修复了旧版本中的内存泄漏问题。

# 更新uni-app CLI工具
npm install -g @dcloudio/uni-cli

# 在项目根目录下更新依赖
npm update

总结

内存泄漏通常涉及复杂的资源管理问题,上述方法提供了一些基本的处理策略。如果问题依然存在,建议深入分析内存使用情况,可能需要使用专业的内存分析工具,或者考虑与uni-app社区或开发者支持团队联系寻求帮助。

回到顶部