对齐音频以便使用网络音频 api 流畅播放

2023-12-29

我目前正在尝试弄清楚如何使用网络音频 API 播放分块音频,一切都正常。但是,大多数块之间的转换并不像我希望的那样顺利,有一个非常非常短暂的时刻大多数人之间保持沉默。

我当前的加载和播放代码:

        const response = await fetch(`${this.src}`)
        const reader = response.body.getReader()

        let timestamptowaituntil = 0
        let tolog = []
        let tolog2 = []

        while (true) {
            const { done, value } = await reader.read()

            if (done) {
                console.log(tolog)
                console.log(tolog2)
                console.log(this.ctx)
                break
            } else {
                let audiodata = await this.ctx.decodeAudioData(value.buffer)
                let source = this.ctx.createBufferSource()
                source.buffer = audiodata
                source.connect(this.ctx.destination)
                source.start(timestamptowaituntil, 0, audiodata.duration)
                timestamptowaituntil +=audiodata.duration
                tolog.push(audiodata)
                tolog2.push(source)
            }
        }

我怎样才能消除这些短暂的沉默(或重叠)时刻?

编辑:到目前为止我已经尝试过以下方法

  1. 减少了几毫秒的等待时间。
  2. 删除 AudioContext 的延迟属性中的时间量。
  3. 创建一个函数来使用其比特率获取 UInt8Array 表单数据的播放长度(这确实给我带来了与 audioBuffer 的 .duration 属性略有不同的结果,但仍然存在微小的差距)

在尝试了很多不同的方法之后,我终于有了一个最终解决问题的想法。 我的新想法是简单地在第一个块到达时播放它,同时收集尽可能多的块,每当收集一个块时,它就会与前一个块链接起来以形成一个更大的块(这种方式也使其可以在 Firefox 中工作)要求块具有用于解码的标头)。第一个块的播放在 .duration 属性声明其结束之前 0.5-1 秒停止,这样可以避免检测长度时出现任何异常。同时,播放下一个块。

我为此添加到代码中的一些内容如下:

连接两个块的函数:

const concat = (arrayOne, arrayTwo) => {
    let mergedArray = new Uint8Array(arrayOne.length + arrayTwo.length)
    mergedArray.set([...arrayOne, ...arrayTwo])
    return mergedArray
}

计时时的额外偏移:

                    source.start(timestamptowaituntil, 0, audiodata.duration - .75)

                    timestamptowaituntil += (audiodata.duration - .75 + this.ctx.currentTime)

这加上一些更小的编辑给我带来了一个解决方案,使块交换不可能被听到(时不时地是当CPU过载并且计时变慢时)。

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

对齐音频以便使用网络音频 api 流畅播放 的相关文章

  • 暂停除了已激活的玩家之外的所有其他玩家。

    我有这个插件 它可以将不同的样式应用于 html5
  • ReferenceError:regeneratorRuntime未定义(但在范围内工作)

    我遇到过这种奇怪的情况 ReferenceError regeneratorRuntime is not defined 我已经设法在一个非常小的设置中重现 与同一问题上的类似问题相比 并且还注意到一些奇怪的行为 具体取决于是否使用范围 以
  • 如何使用 JavaScript 创建链接?

    我有一个标题字符串和一个链接字符串 我不知道如何将两者放在一起以使用 JavaScript 在页面上创建链接 任何帮助表示赞赏 我试图解决这个问题的原因是因为我有一个 RSS 源并且有一个标题和 URL 列表 我想将标题链接到 URL 以使
  • Chart.js 在初始化时设置活动段

    我正在使用 Chart js v2 并且尝试在加载图表时模拟圆环图上某个段的 悬停状态 因此看起来有一个部分已突出显示 我已经搜索和梳理了代码一天 但找不到一个好的方法来做到这一点 提前致谢 设置片段的悬停样式有点令人困惑 因为它没有真正记
  • Three.js:缩放几何图形后错误的 BoundingBox

    在我的场景中 我有一个简单的立方体 var test new THREE Mesh new THREE CubeGeometry 10 10 10 new THREE MeshBasicMaterial scene add test 该立方
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 使用 JavaScript 禁用第三方 cookie

    我正在努力根据所有在欧盟运营的公司的数据保护规则实施新的 Cookie 政策合规性 根据该规则 用户在使用任何网站时必须能够拒绝 接受除必需的 Cookie 之外的所有内容 在我客户的网站中 我可以看到正在存储以下第三方 cookie ga
  • 引导程序提前输入未填充承诺的响应

    我的引导程序预输入如下
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • Bootstrap按钮加载+Ajax

    我正在使用 Twitter Bootstrap 的按钮加载状态 http twitter github com bootstrap javascript html buttons http twitter github com bootst
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐

  • 无法使用 Python3 模块请求 POST 到 Grafana

    我正在尝试使用 Grafana 的后端 API 创建一个仪表板 我首先测试我的 API 令牌是否是使用 GET 设置的 并成功获得返回码 200 如下所示 然后 我尝试使用 POST 创建一个简单的仪表板 但我不断收到返回码 400 我很确
  • 表行划分

    好吧 我的应用程序有一个包含很多表格行的表格布局 但我如何在它们之间进行划分 例如 一个表格行 之后是一行 之后是另一个表格行 依此类推 有一些财产吗 Android 3 0 及更高版本中有此功能 在你的表格布局上 android divi
  • 单元测试方法中是否需要总结

    既然单元测试方法的命名使其目的更有意义 那么单元测试方法是否有必要添加摘要呢 Example
  • 如何将Python字典对象转换为numpy数组

    我有 python dict 对象 其键作为 datetime date 对象 值作为元组对象 gt gt gt data dict datetime date 2006 1 1 5 3 datetime date 2006 1 2 8 8
  • Slim + Twig - 如何在开发过程中关闭 Twig 缓存?

    这是我将其注入 Slim 容器中的树枝视图 Views and Templates https www slimframework com docs features templates html container view functi
  • PHP:包含和需要文件时抛出错误

    我尝试创建一个引导文件 但是每当我尝试在另一个文件中包含或需要它时 就会不断出现这样的错误 Warning require once folder file php function require once 无法打开流 没有这样的文件或目
  • 快速获取特定路径下的所有文件和目录

    我正在创建一个备份应用程序 其中 c 扫描目录 在我使用类似的方法来获取目录中的所有文件和子文件之前 DirectoryInfo di new DirectoryInfo A var directories di GetFiles Sear
  • 如何通过只输入一个EOF来结束scanf

    我遇到了这个问题 我正在使用 while 循环来扫描数字字符串 需要结束扫描并开始继续程序的其余部分 我只是不知道如何刷新标准输入或做任何事情而不按 Ctrl D 两次 我只需要发送 EOF 一次来告诉我的循环结束 while feof s
  • 仅在弹性项目内阻止元素?

    显然 弹性项目容器内只能有块元素 内联 内联块 浮动没有任何作用 这很奇怪 除非我做得完全错误 否则似乎没什么用 这是笔 http codepen io iaezzy pen GggVxe http codepen io iaezzy pe
  • vim diff 可以使用耐心算法吗?

    有没有办法将vimdiff的diff策略设置为耐心算法 它内置于 git 中 似乎比普通的 diff 好得多 以供参考 如何将耐心设置为默认的 git diff 算法 https stackoverflow com questions 44
  • 转到 Google 表格中的最后一行数据

    我查了一下 发现以下代码将前进到 Google 电子表格中数据的最后一行 至少在我们添加第 297 行之外的更多行之前是这样 function myFunction var ss SpreadsheetApp getActiveSpread
  • 在父元素中使用 jQuery 获取数据属性的值

    我有以下 HTML 代码 其中onclick of spot info我想得到的值data test div class spot div class spot main span Test span a href class spot i
  • 解析 XML HttpResponse

    我正在尝试解析从 HttpPost 到服务器 last fm 的 XML HttpResponse 用于 last fm android 应用程序 如果我简单地将它解析为字符串 我可以看到它是一个普通的 xml 字符串 包含所有所需的信息
  • Deploy:capistrano 上的符号链接将“当前”目录指向以前的版本

    我正在使用 capistrano 部署我的 Ruby on Rails 项目 我使用的是 Dreamhost VPS 从几周前开始 在 capistrano 或乘客没有任何变化的情况下 我开始在部署中遇到一个奇怪的问题 每次 capistr
  • “navigator.app”文档在哪里?

    我只看到那个navigator appCordova 应用程序中的对象有一些有用的方法 但它们有记录吗 这似乎是一个特定于平台的 API 有意未记录在案 2012 年初开出了一张票 结论是 由于它是非官方的且特定于平台 因此它将保持未记录状
  • 如何关闭“限定符‘this’。” Resharper 中的警告是多余的吗?

    在我的代码中有很多this 限定符 编写 Python 代码的习惯 所以我在右手边的槽中有很多橙色的小警告标记 上面写着 限定符 this 是多余的 我不想删除this 预选赛 如何关闭橙色警告标记 For 锐锐器 9它已被移动 实际上我从
  • 如何使用 PHP 最好使用 SimpleXML 附加到 XML 文件

    我有一个 XML 文件 如下所示
  • R:更改plot_ly中的字体大小

    我一直在尝试更改我的标签上的尺寸x and y使用绘制的图表的轴plot ly in R 下面是我的代码 q lt plot ly x colnames avg exp norm y row names avg exp norm z avg
  • 编辑器模板/显示模板如何识别分配给它们的任何属性?

    我想添加一个 Required 归因于我的DateTime编辑器模板 以便我可以添加适当的验证方案或DataType Date属性 这样我就知道什么时候应该只显示日期 但我不知道如何获取元数据 该元数据说明编辑器模板已分配给它的属性 内置属
  • 对齐音频以便使用网络音频 api 流畅播放

    我目前正在尝试弄清楚如何使用网络音频 API 播放分块音频 一切都正常 但是 大多数块之间的转换并不像我希望的那样顺利 有一个非常非常短暂的时刻大多数人之间保持沉默 我当前的加载和播放代码 const response await fetc