修剪或剪切使用 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 录制的音频 的相关文章

随机推荐

  • 从 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