草庐IT

音频视频自动播放解决方案

音视频老鸽 2023-12-29 原文

1、音频视频自动播放解决方案


1.1、使用背景

公司项目需要用到音频自动播放的功能,首先想到的就是autoplay属性。

想让内容自动播放的最简单方法是将autoplay属性添加到元素,并将autoplay属性设置为 true ,当 autoplay 的属性为 true 时,媒体元素将在发生以下情况后尽快自动开始播放:

  • 页面允许使用自动播放功能

  • 媒体元素已在页面加载期间创建

  • 假设网络性能或带宽没有显着变化,且已收到足够的媒体流并已开始播放,继续播放直至媒体结束而不会中断。

然而在实际操作的过程中,发现自动播放失败,并且出现如下的报错

Uncaught (in promise) DOMException: play() failed because the user didn’t interact with the document first.

这个问题当时困扰了我许久,一路解决的过程也是十分坎坷,所以我决定将解决方案记录下来,下面是我在解决问题的过程中找到的一些资料以及解决问题的方案。

2、 为什么要禁止自动播放音频与视频

网页加载完成后立即播放音频(或带有音频轨道的视频)可能会意外地打扰到用户。尽管自动播放媒体文件是一个很实用的功能,但是我们也应该谨慎地使用它,保证只有在它被需要的时候才使用。为了让用户拥有控制权,通常浏览器会提供各种方式禁用自动播放音频功能。在这篇文章中,我们将介绍各种媒体和 Web Audio APIs 的自动播放功能,包括关于如何使用自动播放功能、如何优雅的处理阻止自动播放功能的一些简短的介绍。

以下网络功能和API可能会受到自动播放阻止的影响:

  • The HTML and element

3、Chrome浏览器Audio标签的自动播放策略

Chrome的自动播放政策很简单:

  • 始终允许静音自动播放

  • 顶级框架可以将自动播放权限委派给其iframe,以允许自动播放

  • 在以下情况下,允许自动播放声音

  • 用户已与和网页已有交互行为,包括点击、触摸、按下某个键等等。(利用弹窗去引导用户点击页面按钮)

  • 在桌面版chrome上,已经超过了用户的“媒体参与度索引”阈值,这意味着该用户以前曾播放过有声视频。(“媒体参与度索引”在后面有介绍)

  • 用户已将网站添加到移动设备上的主屏幕,或者在桌面上安装了PWA。

由于本人是在PC端开发的,所以只能根据上面的条件总结出一下几种解决方案:

  1. 将audio的muted属性设置为true,能够实现静音播放,但是这并不满足我的需求

  1. 使用iframe, <iframe src = "xxxxx.mp3" allow = "autoplay"/>

  1. 使用audio标签,将autoplay设置为true, 当播放失败时与页面做交互(弹窗引导用户点击),来实现自动播放

4、解决方案

考略到项目还需要在音频上实现其他的功能,使用第三种方案比较方便。

既然选择第三种方案,那么该如何检查自动播放失败了呢?事实上,自动播放失败时不会触发任何事件。也没有抛出异常或可以设置回调,甚至在媒体元素上都没有标记来告诉你自动播放是否起作用。那么我们可以换个方向,不去仅仅依赖autoplay,而是使用play方法进行播放,play方法执行时会返回一个promise,可以根据promise来判断当前的播放是成功了还是失败了,并且在失败后做出相应的解决方法

constaudioElem=document.querySelector("audio");
letstartPlayPromise=audioElem.play();
​
if (startPlayPromise!==undefined) {
  startPlayPromise.catch(error=> {
    if (error.name==="NotAllowedError") {
      // 弹窗引导用户与页面做交互,只需要一个简单的按钮即可
      // 记得在按钮上绑定一个带有play()方法的回调函数,以element-plus的组件为例
      ElMessageBox.alert('当前正在自动播放音频', '提示', {
        confirmButtonText: '确认',
        callback: () => {
          audioElem.play();
        },
      })
    } else {
      // Handle a load or playback error
    }
  }).then(() => {
    // Start whatever you need to do only after playback
    // has begun.
  });
}

5、 更进一步

如果产品看到这个弹窗之后,十分的不爽,硬是要让我们在尽可能不让用户察觉到需要交互的情况下实现自动播放,那么该怎么办呢?

既然与页面做了交互之后就能正常播放了,那么我事先将交互事件绑定到document元素上,是不是就可以在用户不知情并且很自然的情况下,完成交互了呢?

// 点击
document.addEventListener('click', () => {
    document.querySelector("audio").play();
});
​
// 监听鼠标移动的事件
document.addEventListener('mousemove', () => {
    document.querySelector("audio").play();
});

6、MEI 媒体参与度索引

在以chorme为内核的浏览中,设置了MEI(Media Engagement Index)列表,该列表长度为1000,用来来衡量用户是否是该网站的“忠实用户”。当MEI排名足够高时,即可自动播放。

MEI衡量个人在网站上消费媒体的倾向。Chrome 当前的做法是每个来源的访问次数与重要媒体播放事件的比率

  • 媒体(音频/视频)的消耗必须大于7秒。

  • 音频必须存在且不能静音。

  • 带有视频的标签处于活动状态。(个人感觉是不能设置display: none, visibility: hidden等)

  • 视频大小(以px为单位)必须大于200x140

由此,Chrome计算出的媒体参与度得分在定期播放媒体的网站上足够高时,允许在桌面上自动播放媒体播放。

可以在chrome://media-engagement 内部页面上找到用户的MEI 。

作者:Withoutmelv链接: https://juejin.cn/post/7073119971735240734

有关音频视频自动播放解决方案的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  4. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  5. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  6. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  7. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  8. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  9. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  10. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

随机推荐