尽管从点击事件中调用,Safari 仍会阻止视频上的 play()

Posted

技术标签:

【中文标题】尽管从点击事件中调用,Safari 仍会阻止视频上的 play()【英文标题】:Safari blocks play() on video despite being called from click event 【发布时间】:2018-04-27 09:24:50 【问题描述】:

我正在为 html5 元素创建一些自定义视频控件。我已经将一个点击事件处理程序绑定到一个播放/暂停按钮,该按钮在相应的视频上调用 .play() 。

根据我的研究,Safari 将阻止对 .play() 的调用,除非您在点击处理程序中,但它会阻止我对 .play() 的调用,尽管我是从点击处理程序中触发它的,例如所以:

$('.video-container .play-pause').click(function(event)
    var $video = $(event.currentTarget).parent().find('video');
    if($video[0].paused)
      $video[0].play();
    else
      $video[0].pause();
);

还有错误:

Unhandled Promise Rejection: NotSupportedError (DOM Exception 9): The operation is not supported.

来自$video[0].play();

Safari 版本 11.0.1 (13604.3.5)

OSX High Sierra 10.13.1 (17B48)

有什么想法吗?

【问题讨论】:

您是否尝试将事件处理程序添加为 HTML 中的属性而不是通过 jQuery?例如,<html class="video-container play-pause" onclick="sameFunctionAsYourPreviousExample()"/> 感谢您的建议 - 刚刚尝试过,它会导致相同的错误消息。我使用的代码是:window.main['play_pause_click'] = function(control) console.log("Playing..."); $(control).parent().find('video')[0].play(); ; 和 onclick="window.main['play_pause_click'](this)" 【参考方案1】:

哎呀。解决方案是对视频源使用绝对路径,而不是相对路径。

这是错误的:<video src="assets/vid.mp4"></video>

这是正确的:<video src="http://example.com/assets/vid.mp4"></video>

【讨论】:

除非您在主页上,否则您拥有的两个示例是不同的路径。src="assets/vid.mp4" 是相对于当前文档路径的,这意味着如果您在 http://example.com/page/ 上,源将尝试加载来自page/assets/vid.mp4。正确的src 应该是/assets/vid.mp4,因为前面的斜杠是相对于服务器根目录的。 感谢您的建议,但是视频正在加载并且控件在 chrome 和 firefox 上正常工作,并且相关链接确实在主页上。【参考方案2】:

值得注意的是,每当您在 Safari 加载失败的视频上调用 .play() 时都会发生此错误。

另外有趣的是,Safari 需要 Web 服务器支持字节范围请求才能正确加载视频文件。请参阅此处的注释:https://***.com/a/36299252

我最近遇到了从 php 命令行进程而不是像 Apache 或 nginx 这样的专用 Web 服务器提供文件的问题,我无法弄清楚为什么视频在现场网站上播放,但在我的开发环境中却没有。

确定这一点的一种快速方法是直接从地址栏加载视频。如果加载失败,您的服务器可能不支持字节范围请求。

【讨论】:

一定花了很长时间才弄明白!感谢发帖。【参考方案3】:

想通了,Mac 上的 Safari 需要服务器发送视频/mp4 的内容类型

当我尝试使用提供内容类型应用程序/mp4 的文档管理器中的直接链接时,这(仅)在 Safari 中不起作用。

【讨论】:

【参考方案4】:

我有同样的问题。视频无法在 Safari 中播放。但显然,当我将不同的 mp4 文件放在同一个地方时,视频播放成功。我使用具有不同设置的 ffmpeg 工具来生成视频。

这个问题对我没有帮助,但给了我这个想法:FFMPEG video conversion to MP4 works everywhere except in ios Safari/Chrome。

简而言之,请确保您尝试了一些视频文件,而不是现在尝试。

【讨论】:

以上是关于尽管从点击事件中调用,Safari 仍会阻止视频上的 play()的主要内容,如果未能解决你的问题,请参考以下文章

Video.js - 阻止点击播放功能

禁用浏览器页面的特定事件

jquery触发视频的点击事件

单个PHP“退出;”声明阻止 Safari 中的 HTML5 视频

如何阻止MonoDevelop在调试时打开Safari窗口?

尽管没有登录 iTunes 帐户,iOS 仍会恢复应用内购买