原始音频数据流传输过程中网络音频播放出现裂纹

2023-12-31

我有一台服务器通过网络套接字发送原始音频块。我们的想法是检索这些内容并以尽可能流畅的播放方式播放它们。

这是最重要的一段代码:

ws.onmessage = function (event) {
    var view = new Int16Array(event.data);
    var viewf = new Float32Array(view.length);

    audioBuffer = audioCtx.createBuffer(1, viewf.length, 22050);
    audioBuffer.getChannelData(0).set(viewf);
    source = audioCtx.createBufferSource();
    source.buffer = audioBuffer;
    source.connect(audioCtx.destination);
    source.start(0);
};

这工作得很好,但播放中存在一些裂缝:网络延迟并不总是恒定的,因此最新的数据块不会恰好在播放的前一个数据块结束时到达,所以我最终可以得到以下任一结果:两个缓冲区一起播放很短的时间或根本不播放。

I tried:

  • 挂钩source.onended在播放下一个时,但它不是无缝的:每个块的末尾都有一个裂缝,并且每个接缝总体上都在累积,因此与流相比,播放变得越来越晚。
  • 将新数据附加到当前播放的缓冲区,但这似乎是被禁止的:缓冲区具有固定大小。

是否有适当的解决方案来修复该播放?唯一的要求是播放来自网络套接字的未压缩音频。

编辑:解决方案:鉴于我知道我的缓冲区长度,我可以这样安排播放:

if(nextStartTime == 0) nextStartTime = audioCtx.currentTime + (audioBuffer.length / audioBuffer.sampleRate)/2;
source.start(nextStartTime);
nextStartTime += audioBuffer.length / audioBuffer.sampleRate;

第一次,我将播放的开始时间安排为半个缓冲区之后,以允许最大的意外延迟。然后,我将下一个缓冲区开始时间存储在缓冲区末尾的最末尾。


你可能应该从https://www.html5rocks.com/en/tutorials/audio/scheduling/ https://www.html5rocks.com/en/tutorials/audio/scheduling/这很好地解释了如何在 WebAudio 中安排事情。

对于您的用例,您还应该利用这样一个事实:您知道 PCM 样本的采样率并且知道您读取了多少样本。这决定了播放完缓冲区需要多长时间。用它来确定何时安排下一个缓冲区。

(但请注意,如果 PCM 采样率与audioCtx.sampleRate,数据将被重新采样,这可能会扰乱您的时间。

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

原始音频数据流传输过程中网络音频播放出现裂纹 的相关文章

  • 使用 VSCode 的 EJS 文件缩进错误

    我在 VSCode 上遇到 EJS 文件问题 每次保存文件时 格式化程序都会应用错误的缩进 在每个 EJS 标识符下方 下一行向右移动 缺少正确的垂直对齐 我使用 ejs 的 HTML 格式并安装了 DigitalBrainstem 的 E
  • 保证金如何运作?

    我在下面提供了marginfix这是一个块级元素并且one and two也是块级的 但它们是浮动的 这就是为什么它们位于同一行布局的原因 但是marginfix也不浮动 块级元素应位于该元素下方 如下所示
  • CSS 过滤器在 Firefox 中不起作用

    我正在尝试 CSS 过滤器 但它在我的 Firefox 15 0 浏览器中不起作用 HTML div class google img src https www google com images srpr logo3w png div
  • 当 Chrome 中嵌套滚动中的数据更改时防止页面滚动

    我在页面中有一个固定大小的元素 带有 溢出 滚动 其内容经常更改 我预计该元素内部发生的更改会影响该元素的滚动 但不会影响页面滚动 但是当这个元素位于页面顶部时 页面本身开始滚动 我怎样才能防止这种情况发生 要重现此行为 我在 chrome
  • CSS以两种颜色显示一个字符[重复]

    这个问题在这里已经有答案了 css中是否可以用两种颜色制作单个字符 我的意思是例如字符 B 上半部分为红色 下半部分为蓝色 h1 font size 72px background webkit linear gradient red 49
  • 如何在 HTML 中将文本设置为粗体?

    我正在尝试使用 HTML 将一些文本加粗 但我很难让它发挥作用 这就是我正在尝试的 Some
  • 当 SVG 是编码的 CSS 背景图像时,如何更改 SVG 颜色?

    我的 CSS 文件中编码了一个 SVG 图标 如何在悬停时更改其颜色而不具有不同颜色的重复图标 在我的 CSS 文件中 我有 background image url data image svg xml 3Csvg xmlns http
  • IE9 表格布局固定 colspan 不受尊重

    我发现这个主题 我的主题相关但不相同 在 IE9 中的 tds 上使用 cols 和 colspan 进行表格渲染 https stackoverflow com questions 14236408 table rendering wit
  • 在 CSS 选择器中转义双引号

    我有一个 html 标签 div style background image url div images test jpg gt 我想使用 CSS 选择器来定位这个元素 我尝试了下面的选择器 但它抛出错误 document queryS
  • 在 html 中显示表单时使用 table 标签是不是不好的设计?

    我一直听到这样的话div标签应该用于布局目的 而不是table标签 那么这也适用于表单布局吗 我知道表单布局仍然是一个布局 但似乎使用以下命令创建表单布局divs 需要更多html and css 因此 考虑到这一点 表单布局应该使用div
  • html 抓取和 CSS 查询

    以下库的优点和缺点是什么 PHP 简单 HTML DOM 解析器 http simplehtmldom sourceforge net QP http querypath org phpQuery http code google com
  • 粉碎一个元素,向随机方向发送碎片

    我试图 粉碎 一个元素 例如 一个图像 并将其碎片朝随机方向飞行 当碎片到达目的地时 即x距离 以像素为单位 它们变成原始图像的较小版本 jQuery UI 的explode http api jqueryui com explode ef
  • 我什么时候应该使用内联和外部 Javascript?

    我想知道什么时候应该包含外部脚本或将它们与 html 代码内联编写 就性能和易于维护而言 这方面的一般做法是什么 真实场景 我有几个需要客户端表单验证的 html 页面 为此 我使用了一个包含在所有这些页面上的 jQuery 插件 但问题是
  • 内容安全策略:页面设置阻止自行加载资源?

    我有基于 Java 的 Web 应用程序运行在Tomcat http en wikipedia org wiki Apache Tomcat6 我的应用程序在本地主机和端口 9001 上运行 为了使我的应用程序更加安全并降低风险XSS ht
  • 使用 jQuery 更改 SVG 元素的“xlink:href”属性

    我正在尝试使用单击事件更改 xlink href 属性 到目前为止它部分有效 这就是我正在做的 HTML a href class ui btn ui corner all ui shadow editIcon style text ali
  • IE 上具有最小宽度的内联跨度

    Hi我有 3 个SPAN那一定是inline并且有和一个min width 显然在 IE 上 SPAN不能有一个min width 我尝试使用DIV但当我把它放在inline the min width是忽略 CSS span displa
  • 单击时突出显示文本(javascript jquery html)

    当您在所有浏览器中双击某个单词时 它们会自动突出显示单击下的单词 但是否有可能找到一种方法exact单击一下就会发生同样的事情吗 我想这涉及到的事情可能是 TextRange 的东西 对所有段落 或整个正文或 div 的 onclick 做
  • 如何从 HTML 中的列数据而不是行数据创建表格?

    根据这篇文章W3学校 http www w3schools com html html tables asp 可以像这样在 HTML 中创建一个基本表格 table border 1 tr td row 1 cell 1 td td row
  • Bootstrap - 为反向行模式创建移动自适应

    我想用 Bootstrap 创建一个反向效果 第一行 左边是文字 右边是图像 第二行 左边是图片 右边是文字 第三行 左边是文字 右边是图片 第四行 左边是图片 右边是文字 而且这种情况一直持续下去 它在大型设备上看起来非常漂亮 但当它在设
  • 使用 BASH 和 AWK 创建 HTML 表

    我在创建 html 表来显示文本文件中的统计信息时遇到问题 我确信有 100 种方法可以做得更好 但这里是 以下脚本中的注释显示了输出 bin bash function getapistats curl s http api exampl

随机推荐

  • GDB使用什么信号来实现tracee和tracer之间的控制传递

    通过控制转移 我的意思是 在tracee执行函数并返回后 会生成哪个信号以便GDB可以在其上等待 并再次夺取控制权 尽管很多人声称这不是 SIGTRAP 在tracee执行函数并返回后 会生成哪个信号以便GDB可以在其上wait 并再次夺取
  • C#中的无锁会话有哪些?

    我了解 C 中的会话以及如何定义它们 但今天我听到一个词Lock free session 我用谷歌搜索但没有得到任何与我的问题完全匹配的答案 谁能解释一下 C 中的无锁会话以及如何为它们编写代码 以下是一些内容来自msdn http ms
  • 如何使动态创建的div可编辑

    我要实现div创建的可编辑动态地 这也是可拖动的 div 这就是我尝试过的 1 divid attr contentEditable true 2 divid live click function this click contentEd
  • 获取 glFrustum 的坐标

    我刚刚开始阅读有关OpenGL主题 特别是关于Viewing http glprogramming com red chapter03 html以满足我目前的需求 我试图理解glFrustum根据我的理解 对我在屏幕上绘制的对象进行透视投影
  • 从 JVM 上的堆栈帧获取局部变量

    有没有办法在不使用调试器的情况下在 JVM 上获取当前范围内的局部变量的映射或其他数据结构 即获取当前栈帧的局部变量 我知道有堆栈跟踪对象 但是StackTraceElement无法访问任何状态 它只是告诉您在哪里调用了什么方法 但不告诉您
  • 无法设置 Content-Type 标头

    我在 HttpClient 上设置 Content Type 时遇到问题 我沿着这个问题 如何为 HttpClient 请求设置 Content Type 标头 https stackoverflow com questions 10679
  • 计算机编程艺术中approximateEqual和essentialEqual的区别

    我从其他地方得到这个代码片段 据站长介绍 代码摘自 由于我没有那本书 请问这两个函数有什么区别 bool approximatelyEqual float a float b float epsilon return fabs a b lt
  • C# 接口和 Haskell 类型类之间的区别

    我知道这里有一个类似的问题 但我想看一个例子 它清楚地表明 你不能做什么interface并且可以使用 Type Class 为了进行比较 我给你一个示例代码 class Eq a where a gt a gt Bool instance
  • 如何在Python中使用pdfminer从在线PDF中提取文本

    我想使用 pdfminer 使用下面的代码从在线 PDF 中提取文本 它没有显示错误 但输出什么也没有 from pdfminer pdfpage import PDFPage from urllib import request from
  • 如何在 Android 中将文件上传到 Cloudinary 时显示进度?

    我实现了将文件上传到Cloudinary的功能 Cloudinary cloudinary new Cloudinary Constants CLOUDINARY URL try FileInputStream is new FileInp
  • Python - Windows - 当“不相关”父进程死亡/崩溃时退出子进程

    经过一番研究后 对于如何让子进程了解父进程在 Windows 下已死亡 崩溃 退出这可以使子进程在无人值守的情况下运行 没有明确的答案 有一些建议如下 Jobs Python 当父进程死亡时如何杀死子进程 https stackoverfl
  • 如何更改 ListView 项目在焦点和单击时的颜色

    我的应用程序中有一个列表视图 这是 xml 布局
  • 日期上的 Asp.net LINQ groupby 和 orderBy 未检索预期输出

    我正在使用 linq2sql 开发 asp net mvc3 应用程序 我有一个 SiteLog 对象类型列表 其中还包含每个对象 名为 CLRExceptionType 的字符串和名为 EntryDate 的日期 该列表包含在字典中 pr
  • Python Kivy不会使用SDL2,坚持使用pygame

    我努力做Kivy https kivy org 1 11 0 使用SDL2 on 乌班图18 04桌面 它不断要求pygame但这已被弃用 我不想将其用于新项目 在全新的Ubuntu 18 04 虚拟机这就是我所做的 sudo apt in
  • 许多 URI 语法中“://”的起源 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 谁都知道 或者 来自大多数 URI 语法 例如 为什么不写成 http www example com a1kmm 的答案对于 URL 的特定应用很有
  • IIS AppPoolIdentity 和文件系统写入访问权限

    这是 IIS 7 5 和 ASP NET 的一个问题 我一直在研究但毫无进展 任何帮助将不胜感激 我的问题是 在 IIS 7 5 中使用 ASP NET IIS 和 或操作系统如何允许 Web 应用程序写入类似的文件夹C dump在完全信任
  • iphone NavigationController 清除视图堆栈

    我有一个使用导航控制器的 iPhone 应用程序 在该控制器中我推送了一些视图 在某些情况下 我想 清除 视图堆栈 只保留堆栈中导航控制器的 rootViewController 并推送我拥有的另一个 viewController 有人可以
  • 在 ionic 2 中使用 nav.push 和侧面菜单

    我尝试制作一个小应用程序ionic2了解它 但我在导航方面遇到问题 事实上我很清楚a之间的区别rootpage 换成白色nav setRoot 和一个 正常 页面 添加nav push 问题是对于我的应用程序 我需要能够打开侧面菜单 如果我
  • Sonarqube 针对特定产品风格和构建类型运行(gradle 插件)

    目前 我们在针对特定构建变体运行 sonarqube 时遇到问题 例如clienttestDebug 我们的结构是这样的 我们有 3 种不同的构建类型 Release Debug Profile 并拥有多种 超过30种 产品口味 例如 pr
  • 原始音频数据流传输过程中网络音频播放出现裂纹

    我有一台服务器通过网络套接字发送原始音频块 我们的想法是检索这些内容并以尽可能流畅的播放方式播放它们 这是最重要的一段代码 ws onmessage function event var view new Int16Array event