使用 AudioWorklet 传输捕获的音频时如何防止中断/不稳定/故障?

2024-02-13

我们一直在开发基于 JavaScript 的音频聊天客户端,该客户端在浏览器中运行并通过 WebSocket 将音频样本发送到服务器。我们之前尝试使用 Web Audio API 的 ScriptProcessorNode 来获取样本值。这在我们的台式机和笔记本电脑上运行良好,但在从我们必须支持的手持平台传输时,我们遇到了较差的音频质量。我们将此归因于记录的脚本处理器性能问题(https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)。在手持设备上,脚本处理器缓冲区大小为 2048,音频始终出现中断。在下一个最大大小间隔 (4096),音频很流畅(没有中断),但延迟太多(大约两秒)。

我们从 ScriptProcessorNode 获得的结果促使我们尝试使用 Audio Worklet。不幸的是,在我们的工作集实现中,音频质量更差:中断和延迟,即使在我们的笔记本电脑上也是如此。我想知道是否有一种方法可以调整我们的工作集实现以获得更好的性能,或者我们所经历的是否是音频工作集当前状态的预期(“符合课程标准”)(Chromium 问题)796330 https://bugs.chromium.org/p/chromium/issues/detail?id=796330, 813825 https://bugs.chromium.org/p/chromium/issues/detail?id=813825, and 836306 https://bugs.chromium.org/p/chromium/issues/detail?id=836306似乎相关)。

以下是有关代码功能的更多详细信息:

  1. 使用从 getUserMedia 获取的 MediaStream 创建 MediaStreamStreamSourceNode。
  2. 将源节点连接到我们的工作集节点实现(扩展 AudioWorkletNode)。
  3. 我们的工作集处理器实现(扩展 AudioWorkletProcessor)缓冲作为其处理方法的“输入”参数到达的块。
  4. 当缓冲区已满时,使用 MessagePort 将缓冲区内容发送到工作集节点。
  5. Worklet 节点通过 WebSocket 连接传输缓冲区内容。

其工艺方法如下。 var“samples”是一个 Float32Array,它被初始化为缓冲区大小并重用。我对缓冲区大小进行了一些尝试,但似乎没有影响。该方法基于第 4.1 节中的指导AudioWorklet:网络音频的未来 https://hoch.io/assets/publications/icmc-2018-choi-audioworklet.pdf以最小化内存分配。

if (micKeyed == true) {

    if (inputs[0][0].length == framesPerBlock) {
        samples.set(inputs[0][0], currentBlockIndex * framesPerBlock);
        currentBlockIndex++;

        if (currentBlockIndex == lastBlockIndex) {
            // console.log('About to send buffer.');
            this.port.postMessage(samples);
            currentBlockIndex = 0;
        }
    } else {
        console.error("Got a block of unexpected length!!!");
    }
}
return true;

目前正在使用 CentOS 7 上运行 Chrome 72.0.3626.109 的 PC 进行测试。我们的手持设备是 Panasonic FZ-N1,在 Android 6.0.1 上运行 Chrome 72.0.3626.105。

感谢您的阅读以及您可能提供的任何建议。


None

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

使用 AudioWorklet 传输捕获的音频时如何防止中断/不稳定/故障? 的相关文章

  • 实现快速 Javascript 搜索?

    基本上 我有一个带有文本框的页面和 ul 列在其下面 这 ul 由用户的朋友列表填充 用户开始在文本框中输入朋友的名字 例如按 r 我想立即更新 ul 每次按键仅显示名字以 R 开头的朋友 例如 Richard Redmond Raheem
  • 计算字符串中的唯一单词

    下面我尝试将字符串数组提供给一个函数 该函数将唯一单词添加到单词数组中 并且如果该单词已经在数组中 则增加计数数组中相应元素的计数 var words var counts calculate a b calculate a c funct
  • Grunt-browserify+mapify+coffeescript = 未通过相对路径找到模块

    我尝试让 grunt browserify 使用 Coffeescript 的相对路径 但当我尝试构建源代码时总是收到错误消息 gt gt Error module src app utils includeMixin not found
  • Firebase Auth - 最近登录多长时间

    我有一个个人资料选项卡 用户可以在其中按编辑并编辑他们的个人资料 我只想在必要时才需要他们的密码 所以想知道用户登录的时间是多少毫秒 这使得它不是最近登录 其中firebase会抛出错误 auth requires recent login
  • 不使用 PHP 提交联系表单

    我还是一名学生 今天我们的讲师告诉我们 无需使用 mailto 函数即可提交联系我们表单的唯一方法是使用 PHP 我发誓去年另一位讲师向我们展示了一种仅使用 javascript 的方法 是否可以使用基本表单和 javascript 提交反
  • 如何使用 jQuery 在按下按钮后保持按钮处于活动状态

    我见过一些非常相似的问题 但一直无法找到我正在寻找的答案 我已经确定了解决方法 但想知道执行该任务的正确方法 我想要的是单击按钮并使活动状态保持不变 下一次单击将切换状态 这是所需的 我真正需要知道的是如何解决 uiButton activ
  • 使用 Jquery 附加链接

    我正在尝试根据您所在的页面添加指向我的页面的链接 我使用 Squarespace 来构建这个网站 因此对我来说最简单的方法是使用 Javascript 或 Jquery 我认为我缺少的这个语法有问题 我已经尝试用 来打破引号 但这不起作用
  • 所有事件的 HTML5 EventSource 监听器?

    我使用 EventSource 在 JavaScript 客户端应用程序中推送通知 我可以像这样附加事件监听器 source addEventListener my custom event type function e console
  • Facebook 自定义故事与大图像 - 使用 Javascript 打开图

    我正在尝试创建一个自定义故事 每次有人尝试发布它时都会有一个新图像 现在我创建了一个对象 以及将两者结合起来的动作和故事 我想要实现的是一个看起来像这样的故事https fbcdn dragon a akamaihd net hphotos
  • React Native TypeError:无法读取未定义的属性“createClient”

    我是 React 本机框架的新手 我使用 create react native app AwesomeProject 创建了应用程序 我想在我的项目中使用 BLE 因此我安装了 react native ble plx 模块 但是当我创建
  • 未捕获的类型错误:无法读取未定义的属性“prop”

    我有 6 个输入复选框 如果选中的复选框超过 3 个 则最后一个复选框将被取消选中 为了更好地理解 请参阅我之前的question https stackoverflow com questions 35195235 if checkbox
  • 是否可以进行条件解构或有后备?

    我有一个具有许多深层嵌套属性的对象 我希望能够访问 MY KEY 上的属性 如下 但如果该属性不存在 则获取 MY OTHER KEY 我怎样才能做到这一点 const X Y MY KEY Values segments segment
  • Next.js:如何将 source-map-explorer 与 Next.js 一起使用

    我想分析我的 Next js 构建源地图浏览器 https www npmjs com package source map explorer 有人可以帮我编写脚本吗 对于 React CRA 我使用以下脚本 build analyze n
  • 如何在美人鱼节点描述中添加链接?

    我想 如下图所示 div class mermaid graph TD A hello B an b important b link A gt B div 在下面添加实际链接link指向http google com 我尝试将相关节点修改
  • React Native Android 无法连接到 WebSocket

    尽管 Web 实现可以工作 但 android 模拟器以及我的设备无法连接到 WebSocket 在引发错误的地方收到以下事件错误代码 然后断开连接 connection error Event isTrusted false messag
  • 如何更改元素的 CSS 类并在单击时删除所有其他类

    我如何处理 AngularJS 2 中的一种情况 即单击一个元素需要更改其自己的样式 并且如果其他元素具有该样式 则需要将其删除 最好在一个函数中 如同Angular js 如何在单击时更改元素 css 类并删除所有其他元素 https s
  • iPhone 点击时使 div 变暗

    当您的 div 附加了点击处理程序时 当点击该 div 时 iPhone 会使该 div 变暗 作为点击指示器 示例 在移动 Safari 上查看http jsbin com awejo3 4 http jsbin com awejo3 4
  • JavaScript 正则表达式两个标签之间的多行文本

    我编写了一个正则表达式来从 HTML 中获取字符串 但似乎多行标志不起作用 这是我的模式 我想将文本输入h1 tag var pattern div class box content 5 h1 lt lt h1 gt mi m html
  • YouTube iFrame Player API 无法在 DOMWindow 上执行 postMessage

    我正在尝试使用以下命令将 youtube 加载到我的网页中YouTube iFrame Player API 并在加载时出现以下错误 Failed to execute postMessage on DOMWindow The target
  • 这个 JQuery 指令做什么 $(function(){...}) [重复]

    这个问题在这里已经有答案了 我最近一直在研究JQuery 尽管我知道一些东西 但书上有这样一句话我根本无法理解 function current entry 1 有谁知道这条线是如何工作的以及它的作用是什么 它类似于 JQuery 函数中的

随机推荐

  • 是什么阻止我调整(缩小)我的 Windows 窗体对象的大小?

    我有一个 Windows 窗体对象 其中包含 3 个对象 一个树视图 一个富文本框和一个选项卡控件 它们没有停靠在窗口窗体中 但它们是锚定的 顶部 左侧 我已经编写了在调用 form resize 事件处理程序时调整它们大小的代码 但它似乎
  • 桥接表 - DAX 还是 M?

    我们应该使用 DAX 还是 M 构建桥接表 图片盗自here https stackoverflow com questions 53320431 power bi weighted average yield across 2 table
  • Magento SOAP v1 与 v2 性能对比

    我正在使用 VB NET 来处理 Magento API 我成功地使用了 SOAP v1 直到遇到需要关联数组的调用 经过一天左右的运气不佳后 我决定尝试 v2 它拥有我需要的所有对象 v2 可以工作 但是非常非常慢 要更新一个库存商品库存
  • SQL 查询以获取主管层次结构列表。员工-->主管-->主管

    我有两个表 员工 和 部门 该图像显示了每个员工的经理 我想编写一个 SQL 查询 为我提供所有主管 经理 经理的经理 的列表 我只想要一个列 在给定特定员工时显示主管列表 例如 如果我给员工 id 202 那么我应该收到 200 130
  • 如何查询位于不同数据库中的表?

    我最初的问题是关于是否将 ASPNETDB MDF 与应用程序数据库分开 或者将所有表合并到一个数据库中 检查之前的问题 答案 我了解到这取决于会员数据是否会在多个应用程序之间共享 现在 我的问题是这样的 如果我决定将 ASPNETDB M
  • MinGW的ld无法对非PE输出文件执行PE操作

    我知道还有一些其他类似的问题 无论是否是 StackOverflow 我为此进行了很多研究 但仍然没有找到单一的解决方案 我正在做一个操作系统作为一个业余项目 我一直在汇编中完成所有工作 但现在我想加入 C 代码 为了测试 我制作了这个汇编
  • 如何基于 Func 将 IObservable 窗口/缓冲为块

    给定一个类 class Foo DateTime Timestamp get set 和IObservable
  • 如何调整UIToolBar左右内边距

    我使用代码创建一个 UIToolbar 使用界面生成器创建另一个 UIToolbar 但是 发现两个工具栏的左右填充不同 如下所示 从界面生成器 来自代码 UIImage buttonImage UIImage imageNamed but
  • 使用捆绑器时在 gemspec 中声明开发依赖项仍然有用吗?

    我正在研究一种新的红宝石宝石 我熟悉使用 Bundler 来管理 gem source https rubygems org gemspec gem rspec rails 我熟悉在 gemspec 文件中指定依赖项 Gem Specifi
  • 2D 数组上的 Numpy 滚动窗口,作为以嵌套数组作为数据值的 1D 数组

    使用时np lib stride tricks as strided 如何使用嵌套数组作为数据值来管理 2D 数组 有更好的吗高效的方法 具体来说 如果我有一个 2Dnp array如下所示 其中一维数组中的每个数据项都是长度为 2 的数组
  • 捕获 C# 中存储过程的错误

    我有一个存储过程 用于在登录期间验证用户 如果成功 它会返回用户实体 效果很好 我的问题是 如果它不起作用 我会在 SP 中提出错误 如何捕获此错误并以最佳方式使用它 现在我得到了 nullreference 这是代码 存储流程 ALTER
  • 浮动div两列布局空白

    我有 X 个帖子 每个帖子都有固定的宽度和未知的高度 并希望它们位于单个 div 包装器中的两列中 但是 当我将它们全部放在左侧浮动时 就会发生这种情况 如何删除空格 在偶数块中添加clear right 在奇数块中添加clear left
  • 我可以使用 KIF 检查屏幕上是否存在视图吗?

    我正在执行 每个步骤之前 并且我想要执行注销步骤 我找不到任何关于在尝试触摸某个元素之前检查它是否存在 然后如果它不存在则执行其他操作的内容 是否可以使用 KIF 执行此操作 而无需引用我要检查的对象 就像是 if tester eleme
  • 将操作数xpath断言表达式与soapUI中的预期结果进行比较

    我正在使用soapUI 5 非专业版 我需要的只是验证 断言 预期结果部分中的数字大于零 所以这意味着 1 在XPath表达式 Xpath匹配 中我声明以下内容 我需要删除所有文本并且只有数字然后检查数字是否大于零 replace OUTB
  • Android - 强制取消AsyncTask

    我在我的活动之一中实现了 AsyncTask performBackgroundTask asyncTask new performBackgroundTask asyncTask execute 现在 我需要实现 取消 按钮功能 因此我必
  • Java 中的有符号字节类型和按位运算符?

    引用自甲骨文网站 http docs oracle com javase tutorial java nutsandbolts datatypes html byte 字节数据类型是8位带符号的二进制补码整数 最小值为 128 最大值为12
  • 从我的 Ruby 应用程序构建 Windows 可执行文件?

    我希望能够向一些同事发送 Ruby 应用程序 而不要求他们安装 Ruby 解释器 最好是单个 exe 我用谷歌搜索并找到了 RubyScript2Exe 您对此有什么经验 还有其他这样的工具或者有比构建 exe 更好的方法吗 我已经使用了大
  • R中的循环:如何保存输出?

    我正在尝试保存逻辑测试循环中的数据 所以我有以下数据 T1 lt matrix seq from 100000 to 6600000 length out 676 26 26 a matrix of 26X26 here with illu
  • Python字典-二分查找一个键?

    我想编写一个像字典一样的容器类 实际上派生自字典 该结构的键将是日期 当使用键 即日期 从类中检索值时 如果该日期不存在 则使用该键之前的下一个可用日期来返回该值 以下数据应该有助于进一步解释这个概念 Date key Value 2001
  • 使用 AudioWorklet 传输捕获的音频时如何防止中断/不稳定/故障?

    我们一直在开发基于 JavaScript 的音频聊天客户端 该客户端在浏览器中运行并通过 WebSocket 将音频样本发送到服务器 我们之前尝试使用 Web Audio API 的 ScriptProcessorNode 来获取样本值 这