javascript - mediaElement.play() 方法返回一个被拒绝的 promise

javascript - mediaElement.play() 方法返回一个被拒绝的 promise

标签 javascript html html5-video

我无法在移动浏览器上播放我的视频。使用 Safari 远程调试时,我遇到以下问题:
Unhandled Promise Rejection: AbortError: The operation was aborted.

我找到了这个解决方案:https://developers.google.com/web/updates/2017/06/play-request-was-interrupted

但我不知道,如何在我的代码中使用它来解决问题。

html 复制代码
<video muted id="video" class="absolute right-0 bottom-0 min-w-full min-h-full w-auto" controls>
    <source src="/path/to/video.mp4" type="video/mp4">
</video>
let video = document.getElementbyId('video');
let video_cta = document.getElementbyId('video_cta');

//this doesn't fix my problem
var videoPromise = video.play();

if (videoPromise != undefined) {
    videoPromise.then(function(_) {
      video.pause();
      video.currentTime = 0;
  });
}

//start video after click the button
video_cta.addEventListener('click' function() {
    video.play()
})

最佳答案

首先是 autoplay属性是必需的。

复制代码
<video src='...' controls muted`**autoplay**`></video>`
`<video src='...' controls muted` 自动播放 `></video>

videoPromise是对视频的引用并调用 .play()方法,它将在 Promise 中工作。

复制代码
const videoPromise = document.querySelector('video').play();

OP 代码中也存在依赖关系 .getElementById()被误用:

复制代码
let video = document.getElement`**b**`yId('video');` `let video = document.getElement` 湾 `yId('video');`
`let video_cta = document.getElement`**b**`yId('video_cta');` `let video_cta = document.getElement` 湾 `yId('video_cta');

Google article OP 中提供的还提到 <source>标签将无法处理 reject适本地:

Use

复制代码
<video src='...'></video>

Not

复制代码
<video> <source src='...'> </video>

这应该停止错误消息:

复制代码
Unhandled Promise Rejection: AbortError: The operation was aborted.

演示 1 使用 Promise和方法.then() . 演示 2 使用 async/await . async function被包裹在一个 IIFE ( I mmediately I nvoked F unction Expression )

演示 1

promise 承诺

js 复制代码
let cta = document.querySelector('#cta');

const videoPromise = document.querySelector('video').play();

if (videoPromise != undefined) {
  videoPromise.then(_ => {
video.play();
  });
}

cta.addEventListener('click', function() {
  video.play();
});
<video src="https://storage04.dropshots.com/photos6000/photos/1381926/20170326/005609.mp4" id="video" class="absolute right-0 bottom-0 min-w-full min-h-full w-auto" controls autoplay muted></video>
<button id='cta'>CTA</button>

演示 2

async/await

js 复制代码
let cta = document.querySelector('#cta');

const video = document.querySelector('video');

(function() {
  playMedia();
})();

async function playMedia() {
  try {
    await video.play();
  } catch (err) {}
}

cta.addEventListener('click', function() {
  video.play();
});
<video src="https://storage04.dropshots.com/photos6000/photos/1381926/20170326/005609.mp4" id="video" class="absolute right-0 bottom-0 min-w-full min-h-full w-auto" controls autoplay muted></video>
<button id='cta'>CTA</button>

关于javascript - mediaElement.play() 方法返回一个被拒绝的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55953639/

相关推荐
会Tk矩阵群控的小木12 分钟前
基于Python的iMessage短信群发与社媒多账号统一管理系统实现
开发语言·windows·python·新媒体运营·开源软件·个人开发
我是一颗柠檬15 分钟前
【Java项目技术亮点】分库分表+数据路由策略:单表5000万后的架构升级方案
java·开发语言·分布式·架构
wu_ye_m17 分钟前
学习c语言第35天 函数声明和定义
c语言·开发语言·学习
njsgcs25 分钟前
c# solidworks 创建装配体工程图+bom
开发语言·c#·solidworks
数据知道26 分钟前
视觉伪装(下):WebGL 渲染器与厂商特征的底层伪造与屏蔽
javascript·数据采集·webgl·指纹浏览器
东风破_42 分钟前
JS 数据类型:从八种分类到栈与堆的内存真相
javascript
YIAN43 分钟前
# 从入门到封装:一文搞懂 Fetch API 所有用法(新手友好)
前端·javascript
小林敲代码778844 分钟前
记录一下IDEA中很多变量变色的方案
java·开发语言·spring boot·idea
njsgcs1 小时前
c# solidworks 工程图获得展开视图不在固定面螺纹特征的位置
开发语言·c#·solidworks
qq_8573058191 小时前
python语法
开发语言·python·算法