uni-app nvue文件中,使用video全屏模式并设置loop="true",同时使用createInnerAudioContext添加背景音乐时,每当视频新loop开始时,audio会触发pause事件

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

uni-app nvue文件中,使用video全屏模式并设置loop=“true”,同时使用createInnerAudioContext添加背景音乐时,每当视频新loop开始时,audio会触发pause事件

信息类别 详细信息
产品分类 uniapp/App
PC开发环境 Windows
PC版本号 10
HBuilderX 正式
HBuilderX版本号 3.96
手机系统 Android
手机系统版本号 Android 9.0
手机厂商 小米
手机机型 6x
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

操作步骤:

如题

预期结果:

audio正常播放,不受影响

实际结果:

app端会触发pause事件

bug描述:

nvue文件中,使用video全屏模式,loop=“true”, 再使用createInnerAudioContext添加背景音乐,每当视频新loop开始时,audio会触发pause事件


1 回复

uni-appnvue 文件中,使用 video 组件并设置 loop="true" 时,每当视频重新开始循环播放时,可能会触发 createInnerAudioContext 创建的背景音乐的 pause 事件。这是因为视频的循环播放可能会影响到音频的播放状态。

要解决这个问题,你可以尝试以下几种方法:

1. 监听视频的 ended 事件

你可以监听视频的 ended 事件,在视频播放结束时手动重新播放背景音乐。

<template>
  <view>
    <video id="myVideo" src="your-video-url" loop="true" @ended="onVideoEnded"></video>
  </view>
</template>

<script>
export default {
  data() {
    return {
      audioContext: null
    };
  },
  mounted() {
    this.audioContext = uni.createInnerAudioContext();
    this.audioContext.src = 'your-audio-url';
    this.audioContext.loop = true;
    this.audioContext.play();
  },
  methods: {
    onVideoEnded() {
      // 视频结束时重新播放背景音乐
      this.audioContext.play();
    }
  },
  beforeDestroy() {
    if (this.audioContext) {
      this.audioContext.destroy();
    }
  }
};
</script>

2. 使用 seek 方法

在视频循环时,使用 seek 方法将视频的播放位置重置到开始,而不是让视频自然结束。这样可以避免触发 pause 事件。

<template>
  <view>
    <video id="myVideo" src="your-video-url" loop="true" @timeupdate="onTimeUpdate"></video>
  </view>
</template>

<script>
export default {
  data() {
    return {
      audioContext: null,
      videoDuration: 0
    };
  },
  mounted() {
    this.audioContext = uni.createInnerAudioContext();
    this.audioContext.src = 'your-audio-url';
    this.audioContext.loop = true;
    this.audioContext.play();

    const videoContext = uni.createVideoContext('myVideo', this);
    videoContext.onCanplay(() => {
      this.videoDuration = videoContext.duration;
    });
  },
  methods: {
    onTimeUpdate(event) {
      const currentTime = event.detail.currentTime;
      if (currentTime >= this.videoDuration - 0.1) {
        // 在视频即将结束时,将播放位置重置到开始
        const videoContext = uni.createVideoContext('myVideo', this);
        videoContext.seek(0);
      }
    }
  },
  beforeDestroy() {
    if (this.audioContext) {
      this.audioContext.destroy();
    }
  }
};
</script>

3. 使用 onPlay 事件

你可以在视频的 onPlay 事件中检查背景音乐是否被暂停,如果是,则重新播放背景音乐。

<template>
  <view>
    <video id="myVideo" src="your-video-url" loop="true" @play="onVideoPlay"></video>
  </view>
</template>

<script>
export default {
  data() {
    return {
      audioContext: null
    };
  },
  mounted() {
    this.audioContext = uni.createInnerAudioContext();
    this.audioContext.src = 'your-audio-url';
    this.audioContext.loop = true;
    this.audioContext.play();
  },
  methods: {
    onVideoPlay() {
      if (this.audioContext.paused) {
        this.audioContext.play();
      }
    }
  },
  beforeDestroy() {
    if (this.audioContext) {
      this.audioContext.destroy();
    }
  }
};
</script>

4. 使用 onPause 事件

你可以在音频的 onPause 事件中检查是否需要重新播放音频。

<template>
  <view>
    <video id="myVideo" src="your-video-url" loop="true"></video>
  </view>
</template>

<script>
export default {
  data() {
    return {
      audioContext: null
    };
  },
  mounted() {
    this.audioContext = uni.createInnerAudioContext();
    this.audioContext.src = 'your-audio-url';
    this.audioContext.loop = true;
    this.audioContext.play();

    this.audioContext.onPause(() => {
      // 在音频暂停时重新播放
      this.audioContext.play();
    });
  },
  beforeDestroy() {
    if (this.audioContext) {
      this.audioContext.destroy();
    }
  }
};
</script>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!