uni-app 视频滑动列表出现卡顿bug,视频变得不流畅,以前不会这样
uni-app 视频滑动列表出现卡顿bug,视频变得不流畅,以前不会这样
信息类别 | 详情 |
---|---|
产品分类 | uniapp/App |
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | win10 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 3.96 |
手机系统 | iOS |
手机系统版本号 | iOS 16 |
手机厂商 | 苹果 |
手机机型 | iphone13 |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
示例代码:
<swiper class="swiper" :skip-hidden-item-layou="true" :vertical="true" @change="changeCurrent"
@transition="transition" @animationfinish="animationFinish" :current="index">
<swiper-item v-for="(item, idx) in dataList" :key="item.id" class="swiper-item">
<!-- 视频渲染数预加载数影响性能 -->
<div v-if="Math.abs(index-idx)<=1" class="video-box">
<chunlei-video class="video" :key="item.id" :src="item.src" :height="height" :width="width"
:play="item.flag" :showVideo="Math.abs(index-idx)<=1" @click="handleClick" :gDuration="item.duration"
:initialTime="item.initialTime" @disableTouch="changeDisableTouch" @pause="pauseVideo"
:objectFit="item.objectFit" :poster="item.coverImg">
</chunlei-video>
操作步骤:
- 一直来回上下滚动
预期结果:
- 正常流畅播放
实际结果:
- 卡顿 视频变慢 声音错位
bug描述:
- swiper 视频滑动列表,线上都好好挺流畅的,最近重新打自定义基座,发现视频来回滑动,过一会儿视频就变得奇卡无比,请问是不是官方升级了什么,导致video性能变差!
5 回复
绝对有问题 最近又更新了一版,来回滑动 百分百出线视频卡顿,视频错位或失声的问题
感谢 这个我试了 确实不会卡顿 不过这个切换视频都是从头开始播放,我之前那个插件是续播 才有问题
官方的video组件最近并没有更新。请提供更详细的信息:
是从哪版升级到哪个版?
有没有重现代码,及Appstore的包下载方式
在 uni-app
中实现视频滑动列表时,如果出现卡顿或视频不流畅的问题,可能是由于多种原因导致的。以下是一些常见的排查和优化建议:
1. 检查视频资源
- 视频格式:确保视频格式是兼容的(如 MP4、H.264 编码)。
- 视频分辨率:如果视频分辨率过高,可能会导致解码和渲染压力过大。可以尝试降低视频分辨率或压缩视频。
- 视频加载:确保视频资源加载没有延迟或卡顿,可以通过网络抓包工具检查视频加载时间。
2. 优化列表渲染
- 懒加载:使用
lazy-load
或onPageScroll
监听滚动事件,动态加载视频,避免一次性加载过多视频。 - 复用组件:使用
recycle-list
或virtual-list
组件,减少 DOM 节点数量,提升渲染性能。 - 减少 DOM 层级:简化列表项的 DOM 结构,避免嵌套过深。
3. 优化视频播放
- 自动播放:避免同时播放多个视频,可以通过
onPlay
和onPause
事件控制视频的播放和暂停。 - 预加载:使用
preload
属性预加载视频,但不要过度预加载,以免占用过多内存。 - 销毁未播放的视频:在滑动时,销毁不可见的视频组件,释放资源。
4. 检查内存和性能
- 内存泄漏:检查是否有未释放的资源或事件监听器,导致内存占用过高。
- 性能监控:使用 Chrome DevTools 或
uni-app
自带的性能分析工具,检查 CPU 和内存占用情况。
5. 平台差异
- 平台兼容性:
uni-app
在不同平台(如 H5、小程序、App)上的表现可能不同。检查是否在特定平台上出现卡顿。 - 原生组件:在小程序或 App 中,使用原生组件(如
video
)可能会比 H5 更流畅。
6. 代码优化
- 减少不必要的计算:避免在
scroll
或touchmove
事件中执行复杂的计算。 - 节流和防抖:对滚动事件进行节流或防抖处理,减少事件触发频率。
7. 测试和调试
- 逐步排查:注释掉部分代码,逐步排查问题来源。
- 日志输出:在关键位置添加日志,检查代码执行情况。
示例代码优化
以下是一个简单的优化示例:
<template>
<scroll-view scroll-y [@scroll](/user/scroll)="handleScroll">
<view v-for="(item, index) in videoList" :key="index">
<video
:src="item.src"
:autoplay="activeIndex === index"
@play="handlePlay(index)"
@pause="handlePause(index)"
></video>
</view>
</scroll-view>
</template>
<script>
export default {
data() {
return {
videoList: [
{ src: 'video1.mp4' },
{ src: 'video2.mp4' },
// ...
],
activeIndex: -1, // 当前播放的视频索引
};
},
methods: {
handleScroll(e) {
// 根据滚动位置计算当前可见的视频索引
const scrollTop = e.detail.scrollTop;
// 更新 activeIndex
},
handlePlay(index) {
this.activeIndex = index;
},
handlePause(index) {
if (this.activeIndex === index) {
this.activeIndex = -1;
}
},
},
};
</script>