在 Safari Mobile 上播放(和重放)声音

2024-01-25

当网站上出现新消息时,我需要播放声音。它在 Chrome 和 Safari 上运行良好,但我无法使其在 Safari 移动设备上运行。 我看到声音必须通过用户操作来初始化,所以我尝试了:

var sound = new Audio('./path/to/my/sound.mp3');
var hasPlayed = false;

$('body').bind('click touchstart', function() {
  sound.load();
});    

sound.addEventListener('play', function() {
  hasPlayed = true;
});

var playSound = function() {
  if(hasPlayed) {
    sound.currentTime = 0;
  }
  sound.play();
}

不幸的是,声音仍然无法播放。我也尝试过Buzz http://buzz.jaysalvat.com/图书馆,问题是一样的。

所以,问题是:如何在移动浏览器上以编程方式播放声音?


首先:iOS(5.01、5.1)上的 Mobile Safari 对 HTML5 音频的支持是相当有限 http://buildingwebapps.blogspot.fr/2012/04/state-of-html5-audio-in-mobile-safari.html。但我已经成功地在我的 iPad 2 网络应用程序中获得了一些小的“事件类型”声音。由于您只讨论应用程序的一个声音文件,因此您不必依靠音频精灵技巧(即将多个 MP3 合并到一个 MP3 文件中,并根据您想要的声音更改合并文件中的播放位置)被播放)。

正如您所注意到的,您无法在 Mobile Safari 中自动播放音频,即在用户不单击某些元素的情况下。从技术上来说,音频必须是played(未加载)与单击事件位于同一调用堆栈中。但是,当 Mobile Safari 创建音频对象时,您可能会遇到 0.5 秒的延迟。这是这个“问题”的解决方案:

  • 在应用程序启动时(加载/初始化时),向 HTML 文档添加一个单击处理程序,一旦用户单击/点击应用程序中的任何位置,该处理程序就会开始播放音频文件。这将强制 Safari 开始加载音频。
  • 侦听音频准备好播放时触发的“播放”事件,并立即暂停。
  • 现在,当您需要时再次开始播放音频(无延迟)。

下面是一些快速的 JavaScript 代码:

function initAudio() {
    var audio = new Audio('./path/to/my/sound.mp3');
    audio.addEventListener('play', function () {
        // When the audio is ready to play, immediately pause.
        audio.pause();
        audio.removeEventListener('play', arguments.callee, false);
    }, false);
    document.addEventListener('click', function () {
        // Start playing audio when the user clicks anywhere on the page,
        // to force Mobile Safari to load the audio.
        document.removeEventListener('click', arguments.callee, false);
        audio.play();
    }, false);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Safari Mobile 上播放(和重放)声音 的相关文章

  • HTML5 Canvas 的环绕:如何获取(静态)形状继续围绕画布边缘

    我正在尝试画一个平铺背景在 HTML5 画布上使用 Javascript 但它不起作用 因为与画布边缘相交的形状不会环绕到另一侧 需要明确的是 这些是静态形状 没有及时运动 如何让被画布一侧中断的对象环绕到另一侧 基本上我正在寻找许多视频游
  • HTML 中的自定义自关闭/不配对标签?

    以下代码 jsfiddle http jsfiddle net CUZta var div document createElement div div innerHTML
  • 为什么电子邮件正文给出不同的输出?

    我正在尝试触发来自 Google 应用程序脚本的电子邮件 const body HtmlService createHtmlOutput A b new task b have been added to the Task Manager
  • 使用 AppleScript 单击 safari 网页按钮

    我想弄清楚如何单击网页中的按钮 例如 点击谷歌网页中的 手气不错 按钮 这是我尝试过的 tell application Safari make new document with properties URL https www goog
  • jquery(或纯js)模拟按下回车键进行测试

    模拟用户按 enter 键的最佳方法是什么 element keypress 似乎不允许我传递按下的实际键 这是用于单元测试的 演示在这里 http jsfiddle net 3xTM2 var e jQuery Event keypres
  • Scrapy Splash,如何处理onclick?

    我正在尝试抓取以下内容 我能够收到响应 但我不知道如何访问以下项目的内部数据以抓取它 我注意到访问这些项目实际上是由 JavaScript 和分页处理的 这种情况我该怎么办 下面是我的代码 import scrapy from scrapy
  • VueJS - 验证表单文件上传中的文件大小要求

    我正在使用 Bootstrap Vue 表单制作一个简单的表单 用户可以在其中上传文件 有没有办法验证使用 Vue 表单选择的文件的大小 我想阻止用户上传此类文件 我见过this https stackoverflow com questi
  • 如何突出显示 html 文档中文本查询的搜索结果而忽略 html 标签?

    我有一个字符串 其中包含 html 内容 像这样的东西 const text My name is Alan and I span an span div class someClass artist div 我使用以下命令在反应组件中渲染
  • 使用 javascript 在 IFrame 中打印 PDF 文件仅获取一页

    这是我打印 pdf 文件的代码 在这里 在打印时我只得到一页 我需要一个解决方案 function printPdf var ifr document getElementById frame1 PDF is completely load
  • tinyMCE - 将RemoveFormat限制为格式列表

    当前的tinyMCE版本 3 5 2 Hi 我正在开发一个自定义插件 可以添加和删除自定义格式 http www tinymce com tryit custom formats php 向当前选择添加格式很简单 但我做不到 找到删除多种格
  • 一种用javascript创建随机噪声背景图像(png)的方法?

    YouTube的新布局添加了我非常喜欢的背景随机噪声 在其他网站上看到了几乎完全相同的效果 所以我计划在我的网页原型中使用相同的技术 或者至少在其中使用这个 技巧 我的工具箱以供将来使用 图片是这样的 取自http g raphaeljs
  • chrome.extension.getBackgroundPage() 函数示例

    我正在开发一个需要在后台运行的小型 Chrome 扩展 但是 我知道当我使用弹出窗口时这是不可能的 经过一番阅读后 似乎最好的选择是创建popup js为了运行background js using chrome extension get
  • 设置 D3 力定向图

    致尊敬的读者 我对 javascript 相当陌生 我也遇到过这个问题 我正在尝试实现这个力导向图的修改版本 http mbostock github com d3 ex force html http mbostock github co
  • 对数组进行分组并获取计数[重复]

    这个问题在这里已经有答案了 假设我有这样的数组 foo bar foo bar bar bar zoom 我想将其分组 这样我就可以得到这样的计数 foo 2 bar 4 zoom 1 有没有一个实用程序可以做到这一点 只需使用该功能Arr
  • 如何在 Yii 框架中使用 jQuery?

    如何在 yii 中使用 jquery javascript 如何在 yii 中使用我的脚本 为什么这与以其他方式使用 jQuery 有什么不同 如何在yii中使用jquery 如上所述 您可以注册新的脚本块 也可以注册新的外部脚本文件 您还
  • Angularjs + Typescript,如何将 $routeParams 与 IRouteParamsService 一起使用

    我使用 routeParams 从 URI 中提取属性并为其设置本地变量 当我使用打字稿输入设置 route 参数的类型时 我无法再访问 route 参数 如何访问 routeParams 中的属性 class Controller con
  • Angular 中的动态子组件

    我正在构建一个具有一致的元素列表设计模式的应用程序 如果我有一个 A 类型的对象 我会创建AComponent它接受a作为输入 然后创建另一个组件来迭代 A 列表 AListComponent 那么如果我有一个对象 B 我需要做同样的事情
  • Img src 路径以及要传递的标头参数

    我在 jsp 页面中有一个 img 标记 其中 src 路径需要传递标头参数才能获取图像 我们怎样才能实现它呢 您现在可以使用fetch https developer mozilla org en US docs Web API Fetc
  • iOS Javascript 引擎 parseFloat(1) 返回负数

    这段代码将使错误出现 function causeBug d var k var n parseFloat 1 var c Math abs d if n lt 0 k else k return k n function for var
  • ng-show 令人不安的 div 布局 - angularJS

    我在用ng show notesOpened 如果notesOpened 变量为true 则隐藏div 然而 当隐藏时 它会扰乱布局 有没有办法让 ng show 的行为与 css 属性相同visibility hidden 以便被隐藏的

随机推荐

  • “尝试向 Flutter 发送平台消息,但 FlutterJNI 与原生 C++ 分离。”启动后台服务并关闭应用程序后

    我正在尝试构建一个使用某些包作为位置的应用程序 https pub dev packages location https pub dev packages location 和指南针 https pub dev packages flut
  • 为什么采用一种定义规则,而不是一种声明规则?

    我已阅读以下材料 https www wikiwand com en One Definition Rule https www wikiwand com en One Definition Rule http en cppreferenc
  • 如何自动启用网络位置提供程序

    我正在通过网络获取纬度和经度 它给了我纬度和经度 但是如果我的NETWORK LOCATION PROVIDER未选中 它永远不会向我提供当前位置的纬度和经度 我想要的是 我怎样才能启用NETWORK LOCATION PROVIDER在不
  • Hibernate Spatial - “遇到无效的字节序标志值”异常

    我正在尝试在 PostgreSQL 9 3 上的 Hibernate Spatial 4 0 中运行一个简单的查询 我的表中有许多带有纬度 经度值的对象 并且我正在尝试查询位于特定纬度 经度的给定半径内的对象 几何值似乎没有任何问题地被持久
  • 如何在pygame中检测两个矩形物体或图像之间的碰撞

    我正在制作一款游戏 玩家必须使用碗来接住掉落的物品 我有一些列表中的项目图像和一个用于接住项目的碗的图像 物品会继续下落 如果到达边界 下边缘 就会重置到屏幕顶部 我完成了这个逻辑 允许物品掉落 但我不知道如何检测碗和物品之间何时发生碰撞
  • 在 PyAudio 模块中安装时出现错误

    经过无数次尝试后 我仍然无法安装 PyAudio 而不会出现此错误 我尝试过使用许多方法 包括 pipwin 但它没有被识别为真正的函数 如何安装 PyAudio ERROR Command errored out with exit st
  • 检查提交消息中的特定字符串 - SVN Precommit Hook

    我期望 svn 提交消息中出现以下格式 描述 更改的一些描述 实体 变更请求编号 如果提交时的注释不遵循上述格式 则应抛出错误消息 这个想法是检查提交消息中的关键字符串 Description 和 Entity 我还在检查消息中是否存在评论
  • 为每个页面添加固定的页眉/页脚 jsPDF

    我在用jsPDF https github com MrRio jsPDF从我的网络应用程序的动态 HTML 内容生成 PDF 现在我正在尝试为这些 PDF 提供独特的布局 我想为 PDF 的每一页添加 页眉 和 页脚 jsPDF 会自动生
  • 为面向文档的数据库设计记录键 - 最佳实践

    我们的团队已经开始开发由 Couchbase DB 支持的应用程序 对于我们每个人来说 这都是第一次使用非 SQL 数据库 我们已经开始定义我们的实体 并采用 Couchbase 手册建议的使用 类型 前缀的做法 Entity A key
  • iOS - RestKit 并清除所有数据?

    我使用 RestKit 进行 Web 服务调用 缓存和 etag 我实现了自己的 coredata 模型和 ManagedObjects 用户退出后 我需要清除数据库中的所有数据 我能够成功删除 sqlite 文件并重新创建它 但我找不到清
  • SQLite查询进度条

    我在用sqlite来自 C 我想实现一个进度条 通知用户搜索的进度 Using sqlite3 progress handler http www sqlite org sessions c3ref progress handler htm
  • 实时音频流容器格式

    当我开始接收实时音频 无线电 流 例如 MP3 或 AAC 时 我认为接收到的数据不是原始比特流 即原始编码器输出 但它们总是被包装成某种容器格式 如果这个假设是正确的 那么我想我无法从流的任意位置开始流式传输 但我必须等待某个同步字节 是
  • 我可以在64位python中使用32位dll或exe吗?

    当我使用CDLL在32位python中调用32位dll时 它运行良好 但不幸的是 在我的64位win7操作系统中只安装了64位python 当调用它时 它不是一个有效的win32应用程序 我可以在64位python中使用32位dll或exe
  • 将一行从一个列表视图发送到另一个列表视图

    我在同一个活动中有两个列表视图 其中一个有元素 另一个是空的 我想通过长按将任何元素发送到第二个 lisview 我希望元素执行与第一个列表视图中相同的操作 打开一项活动 这是我的代码 请告诉我该怎么做 MainActivity java
  • LaravelWhere 和 OrWhere 多个条件

    我有以下查询 items UserItems join items items id user items item id gt where user id this gt id gt where quantity gt 0 gt wher
  • 跨多个 Docker 镜像的 Jenkins 管道

    使用 Jenkins 中的声明性管道 如何跨 Docker 映像的多个版本运行阶段 我想在 python 2 7 3 5 和 3 6 上执行以下 jenkinsfile 下面是用于在 docker 容器中构建和测试 python 项目的管道
  • pthread_cond_signal 导致死锁

    我有一个程序 当其中一个线程调用时会死锁pthread cond siganl 或广播 该问题在主程序中可以 100 重现 我无法弄清楚它出了什么问题 因此提取了调用 wait 和 signal 的代码段 然而 僵局cannot与提取的问题
  • 优化 Oracle 查询

    SELECT MAX verification id FROM VERIFICATION TABLE WHERE head 687422 AND mbr 23102 AND RTRIM LTRIM lname iq bzw AND TO C
  • 为什么Java中字符串变量的声明要大写?

    在Java中 当声明一个字符串变量时 String 这个词是大写的 但它不是我遇到过的任何其他类型 例如 int 或 double 为什么是这样 这只是设计师的一些奇怪的武断决定吗 为什么Java中字符串变量的声明要大写 The Strin
  • 在 Safari Mobile 上播放(和重放)声音

    当网站上出现新消息时 我需要播放声音 它在 Chrome 和 Safari 上运行良好 但我无法使其在 Safari 移动设备上运行 我看到声音必须通过用户操作来初始化 所以我尝试了 var sound new Audio path to