当前位置: 首页 > 面试题库 >

在Safari和Mobile Chrome上以编程方式播放带声音的视频

百里文景
2023-03-14
问题内容

随着OSX High-Sierra*的发布,Safari中的新功能之一是网站上的视频将不再自动播放,脚本也无法启动,就像在iOS上一样。作为用户,我喜欢该功能,但作为开发人员,它给我带来了一个问题:我有一个内置HTML5的浏览器游戏,其中包含视频。除非用户更改设置,否则视频不再自动播放。这弄乱了游戏流程。

我的问题是,即使上述活动未直接与视频元素相关联,我能否以某种方式利用玩家与游戏的互动来触发视频自动开始播放?

由于雇主限制我们的发展,我不能使用jQuery或其他框架。pixi.js是一个例外,除其他动画外,我们还使用pixi.js在pixi容器中播放视频。

*同样的限制也适用于Mobile Chrome。


问题答案:

是的,您可以绑定不是直接在video元素上触发的事件的事件:

btn.onclick = e => vid.play();


<button id="btn">play</button><br>

<video id="vid" src="https://dl.dropboxusercontent.com/s/bch2j17v6ny4ako/movie720p.mp4"></video>

因此,您可以将该按钮替换为要求用户单击的任何其他初始屏幕,然后将被授予播放视频的访问权限。

但是要保持此功能,您必须在 事件处理程序* 本身中至少调用一次视频的play方法。 *

无法运作:

btn.onclick = e => {

  // won't work, we're not in the event handler anymore

  setTimeout(()=> vid.play().catch(console.error), 5000);

  }


<button id="btn">play</button><br>

<video id="vid" src="https://dl.dropboxusercontent.com/s/bch2j17v6ny4ako/movie720p.mp4"></video>

正确的解决方法:

btn.onclick = e => {

  vid.play().then(()=>vid.pause()); // grants full access to the video

  setTimeout(()=> vid.play().catch(console.error), 5000);

  }


<button id="btn">play</button><br>

<video id="vid" src="https://dl.dropboxusercontent.com/s/bch2j17v6ny4ako/movie720p.mp4"></video>

附言:这是规范定义的 受信任事件
的列表
,我不确定Safari是否将自身限制为这些事件,也不确定它是否包括所有这些事件。

关于Chrome和准备多个MediaElement的重要说明

Chrome浏览器存在一个[长期存在的错误是由每台主机的最大同时请求数引起的,但确实会影响页面中MediaElement的播放,因此将其数量限制为6个。

这意味着您不能使用上述方法在页面中准备6个以上不同的MediaElement。

但是至少存在两种​​解决方法:

  • 看起来,一旦MediaElement被标记为 用户批准 ,即使您更改其src,它也将保持此状态。因此,您可以准备最多MediaElement,然后在需要时更改其src。
  • 用户手势要求 也涉及Web音频API,一旦允许,它可以播放任意数量的音频源。因此,decodeAudioData()借助该方法,可以将其所有音频资源加载为AudioBuffer,甚至可以从视频媒体加载音频资源,这些图像流可以仅<video>在与AudioBuffer并行的静音元素中显示。


 类似资料:
  • 嗨,我有几个视频不能在Android(直接在Chrome上)和iOS(直接在Safari上)上播放,但可以在Windows、Mac和Linux上任何浏览器上播放。 下面是输出 下面是另一段在Android和Chrome上播放的视频的ffprobe输出: 两者都是.mp4格式,并使用编解码器。就我所见,我注意到编解码器配置文件与和与以及元数据部分的差异。 我尝试用ffmpeg重新编码第一个视频,但没

  • 播放(播放音效/播放录音)

  • 问一下Xamarin.Forms便携里面Xamarin.Forms的音频怎么播放 正如我所知,有依赖服务,我看到了一些示例,只有iOS和Android,但没有Windows Phone 8.1/Windows 8.1和UWP。

  • 只是想知道是否有人能告诉我这是怎么回事。当我播放视频时,我可以听到音频,但视频不显示。这是我的代码,我是初学者

  • 有没有人可以帮助我如何做到这一点,因为很难知道如何在我的简单程序中实现宋。我只是初学者程序员,我想知道如何做到这一点,因为我有一个关于这方面的项目。请用最简单的方式帮助我,因为我还不太擅长java编程,谢谢^_^ //这是我的代码。你不认为这是可能的吗?

  • 问题内容: 这是我用来在我的react应用程序中使用url(this.url)播放声音的代码。当我按下播放按钮时,它给我一个错误 我不确定为什么会这样,因为我没有看到任何未定义的状态。一个;; 状态已经声明。 我是新来的反应者,所以我可能会错过一些非常重要的东西。 请帮忙! 问题答案: 我稍微改进了Jaxx的版本,使其包含一个,以便在音频结束时重置按钮。 ES6类属性语法 挂钩版本(反应16.8+