修剪或剪切使用 mediarecorder JS 录制的音频

2024-02-20

所需知识

如何(从前面)缩短音频 blob 数组并仍然具有可播放的音频。

Goal

我最终尝试使用 JS 录制连续 45 秒的音频循环媒体记录器 https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorderAPI。用户只需按一下按钮,最后 45 秒的音频就会被保存。我可以很好地录制、播放和下载单个录音。

Issue

当我有一个名为chunks比如说来自 MediaRecorder 的 1000 个 blob 并使用chunks.slice(500, 1000)生成的 blob 数组不能用于播放或下载音频。

说来也怪chunks.slice(0,500)仍然工作正常。

Code

let chunks = [];

navigator.mediaDevices.getUserMedia({ audio: true })
  .then((stream) => {
    const mediaRecorder = new MediaRecorder(stream);
    mediaRecorder.ondataavailable = (e) => chunks.push(e.data);
  }

// At some later time, attempt to trim
const trimmedAudio = chunks.slice(500, 1000)
const blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' });
const audioURL = URL.createObjectURL(blob);
// audio is an audio DOM element
audio.src = audioURL;
// At this point the audio won't play

尝试过的解决方案

因为从头到中间切片是可行的,所以我尝试了反转、切片、再反转回原来的方向。失败的。

我尝试在开始时留下 16 个斑点,并删除中间的一些。失败的。

Hunch

我的预感是 blob 并不统一包含数据,需要进行一些转换数组缓冲区 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer或特定的 TypedArray。我已经尝试了许多这样的转换,但仍然没有找到解决方案。任何指导将不胜感激,因为我可以找到任何用于编辑记录的 blob 数组的文档。

更新2017-02-11

根据 Kaiido 关于连接块、转换为 ArrayBuffer,然后将其传递给网络音频 api 的建议,我尝试了以下操作。

const blob = new Blob(chunksFromMediaRecorder, { 'type' : 'audio/ogg codecs=opus' })
// blob is Blob size: 32714, type: "audio/ogg codecs=opus"}
function playFromBlob(blob) {
  const aCtx = new (window.AudioContext || window.webkitAudioContext)()
  const source = aCtx.createBufferSource()
  const fileReader = new FileReader()
  let arrayBuffer
  fileReader.onload = function() {
    arrayBuffer = this.result
    console.log('arrayBuffer', arrayBuffer) // ArrayBuffer {} with byte length 32714
    aCtx.decodeAudioData(arrayBuffer) // throws: Uncaught (in promise) DOMException: Unable to decode audio data
      .then(decodedData => {
        // use the decoded data here
        source.buffer = decodedData
        source.connect(audioCtx.destination)
      })
  }

  fileReader.readAsArrayBuffer(blob);
}

上面成功创建了一个与 Blob 大小相同的 ArrayBuffer,但是当我将它传递给decodeAudioData函数,它会抛出Unable to decode audio data错误。我在转换过程中是否遗漏了某个步骤?

更新2017-02-18

Kaiido指出,有一个已知的bug https://bugs.chromium.org/p/chromium/issues/detail?id=642012使用 chrome 会阻止我移动音频数据数组。据我所知,这可以进行任何类型的音频修剪或剪切目前不可能在 chrome 中(Firefox 音频数组修剪有效,请参阅 Kaiido 的评论小提琴)。

为了实现我连续45秒回溯录制的最终目标,我现在实例化两个MediaRecorders偏移 45s 并将它们交换出来。因此,当一个是 45 年代,另一个是 90 年代时,我开始新的录音并摆脱 90 年代MediaRecorder。绝对不是最理想的,但这是我目前能找到的最佳解决方案。


None

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

修剪或剪切使用 mediarecorder JS 录制的音频 的相关文章

  • 页面在 Google Adwords 转化跟踪上重定向

    我有一个表单 人们可以在其中提交数据 然后使用 ajax 将数据发送到服务器 我已将其设置为 Google Adwords 中的转化 下面是我使用过的代码 问题是 当用户提交表单时 在收到响应后 它会重定向回我给出的 URL 我不想重定向
  • 从 Internet Explorer 打印时的默认文件名

    使用 pdf 打印机打印网页 将页面另存为 pdf 时 Chrome 和 Firefox 都使用该页面
  • 在 onclick 事件上请求麦克风

    有一天 我偶然发现了这个 Javascript 录音机的例子 http webaudiodemos appspot com AudioRecorder index html http webaudiodemos appspot com Au
  • 如何使用 JavaScript 刷新页面?

    如何使用 JavaScript 刷新页面 Use location reload https developer mozilla org en US docs Web API Location reload 例如 每当元素带有以下内容时重新
  • 需要使用 iFrame API 隐藏 YouTube 品牌

    我正在使用 YouTube iFrame API 在我的自定义播放器 javascript 播放器 中加载视频 我需要隐藏 Youtube 品牌 但是在 iOS 设备上 它显示带有以下参数的徽标 playerVars fs 1 autopl
  • HTML 和 标签有什么区别?

    HEAD 标签和 BODY 标签有什么区别 大多数 HTML 书籍仅 简短 提及 and 标签 但它们消失得很快 它们会影响浏览器呈现网页的方式吗 另外 它们会影响 javascript 的运行顺序吗 我的意思是 如果我里面有一个javas
  • 有什么方法可以复制 div 的渲染 HTML 吗?

    我正在开发电子邮件签名生成器 我想通过按按钮复制最终签名 而不是手动选择签名并将其复制到剪贴板 这意味着我需要它们的图像 文本和样式 我尝试了几种变体 包括 w3schools 的变体 但没有成功 其中一些只是复制文本 但没有样式 例子 h
  • Chrome 开发工具命中代码但未命中断点

    我在 chrome 开发工具上启用了断点 并且在一行上有一个断点 我知道 chrome 正在运行 因为我将断点放在具有以下语句的行上 alert why is this not breaking 如果我在本地主机中找到该文件 则断点有效 断
  • 如何设置必须输入特定数字的字段?

    我想知道如何创建一个需要输入特定数字或文本的字段 例如 激活码 以及在输入的确认答案的情况下移动到 网页 并且在未确认的情况下移动到 另一页面 的按钮 使用必需的属性
  • Rangy:插入符号下的单词(再次)

    我正在尝试创建一个预输入代码以添加到 wysihtml5 富文本编辑器 基本上 我需要能够插入人员 标签引用 例如 Twitter Github Facebook 我发现一些人试图实现同样的事情的代码 http jsfiddle net A
  • 冒泡可用于图像加载事件吗?

    我可以用吗 window addEventListner 某种程度上来说 我所有的图像都有一个display none 图像加载后 我想设置display inline 这样我就可以规范下载图像时显示的内容 在这种情况下 我无法预加载图像
  • Next.js:错误:React.Children.only 期望接收单个 React 元素子元素

    我有一个名为Nav inside components目录及其代码如下所示 import Link from next link const Nav gt return div a Home a a About a div export d
  • 如何使用 GreaseMonkey 让浏览器恢复“/”键?

    Lots of web pages seem to use the key for searching I d like to disable that because 100 of the time I want to use to se
  • AngularStrap 工具提示禁用我的自定义指令

    我正在尝试让 bs tooltip AngularStrap 指令与我自己的名为 checkStrength 的自定义指令一起使用 该指令检查密码的强度 单独使用这些指令中的任何一个时 它们都可以正常工作 但不能一起工作 This http
  • 使 Bootstrap Popover 在悬停而不是单击时出现/消失

    我正在使用 Bootstrap 构建一个网站Popover http twitter github com bootstrap javascript html popovers我不知道如何使弹出窗口出现在悬停而不是单击时 我想做的就是当有人
  • 标记(Markdown)+ Mermaid(流程图和图表)

    努力去争取 美人鱼 https github com knsv mermaid https github com knsv mermaid跟 共事 标记 https github com chjj marked https github c
  • 绘制多边形

    我正在使用 Google Maps API V3 根据路径绘制多边形 该路径是随机未排序坐标点 LatLng 的数组 这会产生以下形状 Polylines intersect Problem 由于多边形的形状取决于路径中点的顺序 因此如何对
  • 如何为 jQuery 插件设置私有变量?

    我想创建一个简单的插件 它使用元素的文本作为默认值 或者您可以在调用插件时设置此值 但是 如果我不设置该值 并为多个元素调用插件 则默认值会成倍增加 function fn reText function options var setti
  • 使圆圈与 d3.js 上的多线匹配相同的颜色过滤?

    我有一个多线图 当按每种水果过滤时会更新 每条线条颜色对应不同的销售年份 在 的帮助下Shashank https stackoverflow com users 5569282 shashank 每个数据点线上的圆圈已添加到组中 而不是直
  • Jquery 以编程方式更改

    文本

    编辑 解决方案是将其添加到个人资料页面而不是性别页面 profile live pageinit function event p pTest text localStorage getItem gender 我在列表视图中有一个带有一些文

随机推荐

  • 从 D 中的字符串获取普通 char*?

    我正在尝试弄清楚如何从 D 字符串 不可变 char 获取普通的可变 C 字符串 char 以便将字符数据传递给遗留的 C 代码 toStringz 不起作用 因为我收到一条错误 说我 无法将 immutable char 类型的表达式 t
  • 在 Python 中切片字符串时如何使用变量作为索引?

    我一直在尝试使用循环从字符串中切出两个字符 但它不是抓取两个字符 而是只抓取一个 我试过了 input i i 1 and input i i 1 但似乎都不起作用 如何使用变量进行切片 完整的例程 def StringTo2ByteLis
  • 查看netbeans中的执行线

    当我按下运行程序按钮 向右指向的绿色箭头 时 如何查看 netbean v6 8 用于执行我的 java 应用程序的执行行 我正在寻找类似的东西 java cp 构建 类主要 我正在尝试从 15 年使用 vi 编写 c 和 c 转向 jav
  • iPhone iOS 5.0 OpenGl ES 2.0

    说真的 我已经花了几周甚至几个月的时间来寻求有关 iPhone 上使用 XCode 4 2 的 OpenGL 的一些认真帮助 我需要一个很好的教程 介绍如何从使用新的 XCode 4 2 的 OpenGL 游戏 模板开始 然后从那里开始进展
  • Chrome 不支持 css @page?

    我有用于打印的CSS 就像这样简单 page top left content TOP SECRET color red bottom center content counter page font style italic 但Chrom
  • 如何使用 Riverpod 在 Flutter 中刷新 FutureProvider 而无需再次显示加载指示器?

    目前我正在刷新一个 FutureProvider 它负责从 Firebase 获取数据并将其显示在一个简单的 ListView 中液体拉动刷新 https pub dev packages liquid pull to refresh包 这
  • JavaScript:那个与这个

    我试图更好地理解 JavaScript 中 that 和 this 的用法 我在这里关注 Douglas Crockford 的教程 http javascript crockford com private html http javas
  • 按行拆分数据框并另存为 csv

    我只有一个数据框 想要按行分割数据框 将几个新数据框分配给新变量并将它们保存为 csv 文件 a lt rep 1 5 each 3 b lt rep 1 3 each 5 c lt data frame a b a b 1 1 1 2 1
  • 将 zip 文件解压到本地文件夹

    我有带有 Express 的节点应用程序 我从邮递员等客户端发送请求 我需要从req并将其解压到我的本地文件夹中 我该怎么做 我找到了以下开源但不知道如何获取req body并将其提取到我的本地文件夹中 例如 C Test extractD
  • Selenium WebDriver + Tor 作为 Stem 的代理?

    我需要确认是否可以使用 Stem 启动公开 127 0 0 1 port 的 Tor 进程 然后在 selenium 脚本上使用它作为代理 SOCKS 我正在使用 Python 3 4 2 Stem 1 3 0 和 Tor tor win3
  • 如何在 IPython jupyter 笔记本中传递命令行参数

    我是 Ipython 的新手 目前我已经使用 Anaconda 安装了 Ipython 并编写了使用 jupyter Notebook UI 绘制图表的代码 我想在 argparse 模块的帮助下将一些参数传递给我的工作脚本 下面是代码 i
  • 从 Python AST 生成 .pyc?

    如何从 Python AST 生成 pyc 文件以便可以从 Python 导入该文件 我用过compile创建一个代码对象 然后编写co code属性到文件 但是当我尝试从 Python 导入文件时 我得到一个ImportError Bad
  • 对元素进行随机排列,使得任何元素都不应出现在其原始索引处

    我有一个对象元素列表 SourceList ResultList Expected Obj A Obj F Obj B Obj C Obj C Obj G Obj D Obj B Obj E Obj A Obj F Obj B Obj G
  • 我们如何让 DynamicData 与 EFPocoAdapter 一起工作?

    我的团队希望使用 EFPocoAdapter 但也希望使用 DynamicData 工具 但遇到了一些问题 我们基本上将 动态数据实体 Web 应用程序 项目添加到 EFPocoAdapter Northwind 示例解决方案 我使用的是最
  • 当我尝试在 Windows Server 2008 中安装 64 位 mongodb 时,出现“访问被拒绝”的情况

    我所做的就是运行下面的脚本 D Tools MongoDb bin mongod exe dbpath D MongoDb data 然后我得到了例外 连接到服务控制管理中心时出错 访问被拒绝 5 我使用管理员帐户来操作此操作 我已经创建了
  • needDisplayForKey/actionForKey 覆盖是否正常工作?

    我正在尝试将一些在 Objective C 中运行的代码转换为 Swift 我遇到的问题是 needsDisplayForKey actionForKey 没有以相同的方式被调用 据我所知 自定义键值未正确传递 这是我调试时得到的结果 默认
  • 讲解Tkinter文本搜索方法

    我不太明白 text search 方法是如何工作的 比如有一句话 Today a red car appeared in the park 我需要找到a red car序列并突出显示它 它已找到 但我的突出显示如下所示 我在用self t
  • ggplot2:调整 R 中 PCA 双图中 PCA 载荷的标签位置

    Issue 我制作了一个PCA biplot使用包ggbiplot ggplot2 我使用该函数延长了载荷 箭头 geom segment 我想删除原始加载 短箭头 保留较长加载 新箭头 保留带有灰色背景的标签 但重新定位它们 使它们不重叠
  • ElasticSearch术语聚合后如何返回每个桶的所有文档?

    我使用以下简单查询来搜索弹性索引中的文档 query query string query test aggregations myaggregation terms field myField raw size 0 这将返回每个不同值的文
  • 修剪或剪切使用 mediarecorder JS 录制的音频

    所需知识 如何 从前面 缩短音频 blob 数组并仍然具有可播放的音频 Goal 我最终尝试使用 JS 录制连续 45 秒的音频循环媒体记录器 https developer mozilla org en US docs Web API M