HTML 5 音频 .play() 在移动设备上的延迟

2024-02-03

我刚刚使用 socket.io 构建了一个实时应用程序,其中“主”用户可以在接收设备(桌面浏览器、移动浏览器)上触发声音。该主用户会看到声音文件列表,并且可以在声音文件上单击“播放”。

音频播放在浏览器上是即时的。然而,在移动设备上,会出现 0.5-2 秒的延迟(我的 Nexus 4 和 iPhone 5 约为 1 秒,iPhone 3GS 为 1-2 秒)。

我尝试了多种方法来优化音频播放,使其在手机上播放速度更快。现在(我想说的是,在其优化的最佳“阶段”),我将所有 mp3 合并到一个音频文件中(它创建 .mp3、.ogg 和 .mp4 文件)。我需要有关如何进一步解决/改进此问题的想法。瓶颈似乎确实存在于 hmtl 5 音频方法中,例如.play().

在我这样使用的接收器上:

<audio id="audioFile" preload="auto">
  <source src="/output.m4a" type="audio/mp4"/>
  <source src="/output.mp3" type="audio/mpeg"/>
  <source src="/output.ogg" type="audio/ogg"/>
  <p>Your browser does not support HTML5 audio.</p>
</audio>

在我的JS中:

var audioFile = document.getElementById('audioFile');

  // Little hack for mobile, as only a user generated click will enable us to play the sounds
  $('#prepareAudioBtn').on('click', function () {
    $(this).hide();
    audioFile.play();
    audioFile.pause();
    audioFile.currentTime = 0;
  });

// Master user triggered a sound sprite to play
socket.on('playAudio', function (audioClip) {
  if (audioFile.paused)
    audioFile.play();

  audioFile.currentTime = audioClip.startTime;

  // checks every 750ms to pause the clip if the endTime has been reached. 
  // There is a second of "silence" between each sound sprite so the pause is sure to happen at a correct time.
  timeListener(audioClip.endTime);
});

function timeListener(clipEndTime) {
  this.clear = function () {
    clearInterval(interval);
    interval = null;
  };

  if (interval !== null) {
    this.clear();
  }

  interval = setInterval(function () {
    if (audioFile.currentTime >= clipEndTime) {
      audioFile.pause();
      this.clear();
    }
  }, 750);
}

也考虑了每个声音的斑点,但有些声音可以持续几分钟,所以这就是为什么我将所有声音组合在一起形成 1 个大音频文件(比几个声音文件更好)audio每个剪辑页面上的标签)


我没有暂停/播放,而是在不应该播放时将音量设置为 0,在应该播放时将音量设置回 1。这Audio方法currentTime and volume即使在 iPhone 3GS 上也不会减慢音频播放速度。

我还向音频元素添加了“循环”属性,因此它永远不必.play()再次编辑。

将所有 mp3 声音组合在一起是富有成效的,因为该解决方案因此可以发挥作用。

编辑:audioElement.muted = true 或audioElement.muted = false 更有意义。

Edit2:无法在 iOS 上代表用户控制音量,因此我必须暂停()和播放()音频元素,而不是仅仅将其静音和取消静音。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML 5 音频 .play() 在移动设备上的延迟 的相关文章

  • 更新 Google 地图流量层而无需重新加载页面

    我的页面中嵌入了 Google 地图 我使用 initMap js 函数来初始化地图 function initMap var map new google maps Map document getElementById t map zo
  • 如何将函数传递给 JavaScript Web Worker

    我想通过一个 或多个 函数传递postMessage 给网络工作者 因为我无法引用常规文件 为了启动 Web Worker 我将一个对象 URL 从 Blob 创建 传递给Worker构造函数 然后我传递一条消息 但到目前为止还没有在消息中
  • 在 php、ajax 或 javascript 中加载进度?

    任何人都知道如何在系统仍在服务器端获取数据的同时在客户端显示加载进度以及完成的百分比 例如 当我在客户端按下 确定 按钮时 它会调用服务器端从数据库收集数据 整个过程可能需要2到3分钟 如何在客户端显示加载进度 大约加载完成了多少 我怎样才
  • 如何在 div 容器内的元素之间留出空间

    我有一个弹性容器 它将由元素动态填充 容器没有固定宽度 I use max width max content 并且可以包含我想要的任意数量的元素 问题是我需要这些元素之间的间距 但不需要元素和容器之间左侧和右侧的间距 当然我可以用 ele
  • 更改时触发跨度文本/html

    jQuery 或 JavaScript 中是否有任何事件在以下情况下触发span标签 text html 已更改 Code span class user location span user location change functio
  • 如何创建增量加载网页

    我正在编写一个处理大量数据的页面 它会永远持续到我的结果页面加载 几乎无限 因为返回的数据太大了 因此 我需要实现一个增量加载页面 例如 url 中的页面 http docs python org http docs python org
  • 如何将当前元素传递给 Knockout.js 绑定中的 Javascript 函数?

    因此 我尝试根据是否选中子复选框 使用 Knockout js 将类添加到元素 为此 我试图通过this作为我的函数的参数 目前 我的精简 DOM 结构如下 tr td td tr
  • jQuery:如何在显示元素的同时使用高亮效果?

    我在一个页面上有两个元素 div content div div style display none different content div 当我点击当前显示的div 我想隐藏它并显示另一个 这很容易做到 a hide b show
  • 从相机视图中拖动锁定在一定距离/半径处的对象

    我在场景中心有一个相机 距离相机 z 400 处有 1 个球体 其父级位于中心 我想从视图中向上 向下 向左 向右拖动球体 但同时不改变它相对于中心的 z 位置 我最终使用了另一个球体并使其不可见 添加side THREE DoubleSi
  • (0, eval) () 的作用是什么? [复制]

    这个问题在这里已经有答案了 以下内容来自这个问题 https stackoverflow com questions 14119988 return this 0 evalthis 14120023 14120023 function q
  • 仅在首页加载时使用 cookie 加载 colorbox

    我尝试了来自网络的参考代码 仅在页面加载时加载特定元素一次 这是示例代码
  • toLocaleDateString() 在 Chrome 中如何工作?

    我理解了javascript方法toLocaleDateString 使用的计算机设置 让我们来W3Schools 示例 http www w3schools com jsref tryit asp filename tryjsref to
  • PhantomJS 网页内存消耗?

    是否有一种编程方式 因为我想在运行时自动执行 方式来查看网页在通过 PhantomJs 运行时使用了多少内存 我也在使用 casperjs 如果这有帮助的话 我已经搜索了很多但没有找到任何方法 PhantomJs 使用 QtWebKit 因
  • iOS Safari Mobile 禁用上一个和下一个选择输入

    上周五我发现了关于此问题的类似问题 但似乎无法再次找到它 如果有人能指出我正确的方向 那就太好了 本质上我在一个页面上有多个选择菜单 第一个在加载时填充 第二个在第一个选择时填充 够简单的 但是 在 iOS 设备中 当您点击选择元素时 它会
  • 如何修复 getImageData() 错误画布已被跨源数据污染?

    我的代码在本地主机上运行得很好 但在网站上却不起作用 我从控制台收到此错误 对于这一行 getImageData x y 1 1 data Uncaught SecurityError Failed to execute getImageD
  • `ie9` - contenteditable false 在父级可编辑时不起作用

    我正在尝试制作内容可编辑和不可编辑的容器 用户可以通过 3 种方式使用它 他们可以将内容与non editable 他们可以将内容与editable 他们可以在不选择其中之一的情况下放置内容 可编辑 我正在努力实现以下目标 content
  • Javascript:更改输入值时设置光标位置

    当您输入公式时 我试图在我的应用程序中重现类似于 Microsoft Excel Google Sheets 的用户体验 并且您可以使用不同的公式和变量来自动完成下拉菜单 为此 在验证自动完成功能后 我希望能够控制光标的位置 例如 如果我输
  • 响应式导航栏隐藏其下方的元素

    我创建了一个响应式导航栏 但它使下面的元素 Flexslider 插件 消失 在我制作导航栏之前 下面的 Flexslider 可以正常显示 但现在不行 导航栏的 z index 为 2 所以我不知道问题是什么 我应该如何 更改什么才能允许
  • Angular 2访问组件内的ng-内容

    我怎样才能访问 content 来自组件类本身的组件 我想做这样的事情
  • 如何修复nodejs Express服务器中的“MulterError:意外字段”?

    我正在设置一个服务器来从客户端上传 zip 文件 服务器运行express和multer来执行此操作 上传文件时 服务器抛出 MulterError 意外字段 错误 我无法弄清楚是什么导致了它 我尝试过使用 png 图像 效果很好 但对于

随机推荐

  • 在java中调用main内部的main方法

    我们可以在main中调用main方法吗 public static void main String args main a b c 尝试谷歌 找不到链接 抱歉 如果问题很琐碎 您可以但使用正确的格式 main new String a b
  • 重构我的 C# 代码 - Switch 语句

    我目前正在使用以下代码 基本上 此方法为每个任务分配正确的布尔标志 TRUE FALSE 随着需要添加的任务越来越多 我可以看到 switch 语句必须增长才能满足每个任务 必须有一种更简单的方法 来保持方法较小 代码 忘记命名约定 已更改
  • 什么是ReservedCodeCacheSize 和InitialCodeCacheSize?

    有人可以解释一下 JVM 选项吗ReservedCodeCacheSize and InitialCodeCacheSize是 具体来说我什么时候 为什么要改变它 我如何确定合适的尺寸 这就是文档所说的 XX ReservedCodeCac
  • 为什么Java NIO专门引入Buffer类而不是使用数组?

    有人问我一个问题 为什么字节数组不够用 NIO专门引入了一个类Buffer 这个问题的好答案是什么 它只是一种简化读 写操作的包装类吗 如果可能的话 请给我们举个例子来说明我们如何从中受益Buffer不能 很难用数组完成的类 None
  • Facebook API 实时好友在线状态更新

    我目前正在 Facebook 上开发一个应用程序 其中包含我的朋友列表并显示他们的在线状态 为了得到这个 我使用了 fql SELECT uid name online presence status FROM user WHERE uid
  • 如何知道列表中元素的个数是偶数还是奇数

    如何确定任意列表中的元素数量是偶数还是奇数 I tried list index 获得所有索引 但我仍然不知道如何告诉程序什么是偶数 什么是奇数 您可以使用内置函数len 为了这 Python 文档 len http docs python
  • WPF 从 DataTrigger 设置 Image.Source

    我正在尝试定义一个DataTrigger for an Image元素 以便显示连接 断开连接的图像 我不断收到Invalid PropertyDescriptor信息 有任何想法吗
  • 根据方法名称过滤 log4net - 不太明白

    我使用 log4net 来记录我的 Web 应用程序的进度 使用 Log4PostSharp 来 AOP 注入所有方法 这达到了记录 几乎 所有内容的预期效果 并且很好 我现在需要将 Page Load 方法记录到文件 控制台 显然 我可以
  • 如何在 Silverlight 中序列化派生类

    我在 XAML 中创建了一个自定义控件 并添加了一些自定义属性 现在 如果可能的话 我想将其序列化为 JSON 这是 基本上 我所拥有的 public partial class MyCustomClass UserControl publ
  • Ninject MVC3 - 引导程序抛出“已初始化”异常

    我创建了一个空的 Asp Net MVC3 项目 并使用 nugetinstall package Ninject MVC3 无需执行任何其他操作 没有注册服务 甚至没有创建控制器 我就运行该应用程序 该项目在 NinjectMVC3 cs
  • 在 ASP.NET MVC 中组合和缩小 JS 和 CSS

    我创建了默认的 ASP NET MVC 3 Web 应用程序 然后我将三个 css 和三个 js 文件添加到 Views Shared Layout cshtml 视图中 Content Site css rel stylesheet ty
  • Google 地图 API 找不到 $(document).ready 中定义的回调

    我在使用 Jquery 和 Google 地图 API 时遇到问题 脚本似乎在 html 中正确定位
  • 在 R 中,如何访问因子每个级别的第一个元素?

    我有一个像这样的数据框 n c 2 2 3 3 4 4 n lt as factor n s c a b c d e f df data frame n s df n s 1 2 a 2 2 b 3 3 c 4 3 d 5 4 e 6 4
  • CSS 文件被阻止:MIME 类型不匹配(X-Content-Type-Options:nosniff)

    我正在开发一个 Angular 4 应用程序 我想应用一些全局样式 继角度站点的教程 https angular io tutorial toh pt5 global application styles 我在应用程序的根目录中创建了一个
  • Excel 2007 条件格式有 2 个条件,一个基于另一列

    我正在使用 Excel 2007 中的表格 我试图根据一列中的值及其状态 位于另一列中 以一种格式突出显示单元格 例如 我试图突出显示毛利润为负且状态为 IN 的所有单元格 仅单元格 而不是行 这样做的正确方法是什么 我尝试过 if 语句
  • 无法设置二维数组的属性“0”

    谁能告诉我为什么下面的代码会出现此错误 未捕获的类型错误 无法设置未定义的属性 0 var vehicles get poll index php data vehicles function data var rows data find
  • Spark:如何在每个执行器中创建本地数据帧

    在spark scala中有一种方法可以创建执行器中的本地数据帧 例如 pyspark 中的 pandas 在mappartitions方法中 我想将迭代器转换为本地数据帧 如python中的pandas数据帧 以便可以使用数据帧功能 而不
  • 用插值颜色填充阿基米德螺线之间的区域 - Matplotlib

    我想绘制如图所示的各种螺旋 一个螺旋在其他螺旋内部 假设我有三个螺旋 S1 S2 和 S3 我想填充连续螺旋之间的区域 即 S1 和 S2 S2 和 S3 之间的区域 最后是 S3 和 S1 之间的区域 我尝试了多种方法来解决以下两个问题
  • 取消列出数据框中已列出的列

    我有一个包含多个级别的列表 我希望将数据级别转换为数据帧 其中变量 chr 折叠为单个字符串 myList lt list total reach list 4 data list list reach 2 chr list A B C n
  • HTML 5 音频 .play() 在移动设备上的延迟

    我刚刚使用 socket io 构建了一个实时应用程序 其中 主 用户可以在接收设备 桌面浏览器 移动浏览器 上触发声音 该主用户会看到声音文件列表 并且可以在声音文件上单击 播放 音频播放在浏览器上是即时的 然而 在移动设备上 会出现 0