uni-app H5 uni.createVideoContext nextTick 控制视频自动播放并且在onReady和onshow重新加载了视频上下文,电脑端正常,安卓页面刷新不生效

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

uni-app H5 uni.createVideoContext nextTick 控制视频自动播放并且在onReady和onshow重新加载了视频上下文,电脑端正常,安卓页面刷新不生效

开发环境 版本号 项目创建方式
Windows 10 HBuilderX
产品分类:uniapp/H5

浏览器平台:Chrome  
浏览器版本:22.3.3087.64  

示例代码:

```html
<video :id="videoId" style="width: 100%;" object-fit="fill" :custom-cache="false" :autoplay="false" :enable-progress-gesture="false"   
loop="false"  :src="videoPath"></video>
//视频格式是 mp4
let videoId = ref('');
let videoContext = ref(null);
//【生命周期】页面加载完成
onReady(() => {
videoId.value = 'videoPlayer' + Math.round(Math.random()*(3-1)+1 )
videoContext.value = uni.createVideoContext(videoId.value);  
})

onLoad(()=>{
if (videoContext.value) {
videoContext.value.play();
} else{
videoId.value = 'videoPlayer' + Math.round(Math.random()*(3-1)+1 )
videoContext.value = uni.createVideoContext(videoId.value);
nextTick(() =>{
videoContext.value.play();
})
}
})

onShow(()=>{
if (videoContext.value) {
videoContext.value.play();
} else{
videoId.value = 'videoPlayer' + Math.round(Math.random()*(3-1)+1 )
videoContext.value = uni.createVideoContext(videoId.value);
nextTick(() =>{
videoContext.value.play();
})
}  
})

操作步骤:

  • 在电脑端正常,在安卓手机上刷新就不生效了。

预期结果:

  • H5 微信公众号 视频进入页面时和刷新页面都可以实现视频自动播放效果,而且是有声音播放。

实际结果:

  • 视频进入页面时可以实现视频自动播放效果,而且是有声音播放,但是页面一刷新视频就没有播放,声音也没有。

bug描述:

  • H5 uni.createVideoContext nextTick 控制视频自动播放并且在onReady和onshow重新加载了视频上下文,电脑端自动播放正常 安卓第一次进入页面有自动播放,但是在当前页面刷新就不生效了(这里也检测到是有加载到视频,已经执行到了play()方法,但是就是没有效果)

1 回复

针对您提到的在uni-app中使用uni.createVideoContext控制视频自动播放,并在onReadyonShow中重新加载视频上下文,在安卓端页面刷新不生效的问题,这里提供一个可能的解决方案和代码示例。

首先,确保您已经正确使用了uni.createVideoContext来获取视频上下文,并在适当的生命周期钩子中管理视频的播放状态。以下是一个简化的代码示例,展示了如何在onReadyonShow中重新加载视频上下文并尝试自动播放视频:

<template>
  <view>
    <video id="myVideo" src="your-video-url.mp4" autoplay="false"></video>
  </view>
</template>

<script>
export default {
  data() {
    return {
      videoContext: null,
    };
  },
  onReady() {
    this.initVideoContext();
  },
  onShow() {
    this.reloadVideoContext();
  },
  methods: {
    initVideoContext() {
      this.videoContext = uni.createVideoContext('myVideo');
      this.tryAutoPlayVideo();
    },
    reloadVideoContext() {
      if (this.videoContext) {
        // 假设有一个重置视频状态的方法,这里简单处理为重新初始化上下文
        this.videoContext = null; // 清除旧的上下文
        this.initVideoContext(); // 重新初始化上下文
      }
    },
    tryAutoPlayVideo() {
      if (this.videoContext) {
        this.videoContext.play().catch((err) => {
          console.error('自动播放失败:', err);
          // 如果自动播放失败,可以在这里处理,比如显示播放按钮给用户手动点击
        });
      }
    },
  },
};
</script>

在这个示例中,initVideoContext方法在onReady生命周期钩子中被调用,用于初始化视频上下文。onShow生命周期钩子中调用reloadVideoContext方法,该方法尝试重置并重新初始化视频上下文。注意,这里简单地通过设置为null再重新初始化来实现“重置”,实际开发中可能需要根据具体需求调整。

对于安卓端页面刷新不生效的问题,有几个可能的考虑点:

  1. 浏览器策略:某些浏览器(尤其是移动浏览器)对自动播放视频有严格的策略限制,要求视频必须静音或用户交互后才能播放。确保视频满足这些条件。
  2. uni-app版本:检查您使用的uni-app版本是否有已知的相关bug,尝试升级到最新版本。
  3. 代码逻辑:确保在onShow中正确重置了视频上下文,并且tryAutoPlayVideo方法被正确调用。

如果以上方法仍然无法解决问题,建议详细检查控制台日志,查看是否有更具体的错误信息,或者考虑在uni-app社区和官方文档中寻求更多帮助。

回到顶部