使用MediaRecorder录制5秒的音频片段,然后上传到服务器

2023-12-05

我想录制用户麦克风 5 秒长的片段并将每个片段上传到服务器。我尝试使用 MediaRecorder 并以 5 秒的时间间隔调用 start() 和 stop() 方法,但是当我连接这些录音时,之间会发出“滴”声。所以我尝试使用 start() 方法的 timeslice 参数记录 5 秒的片段:

navigator.mediaDevices.getUserMedia({ audio: { channelCount: 2, volume: 1.0, echoCancellation: false, noiseSuppression: false } }).then(function(stream) {
  const Recorder = new MediaRecorder(stream, { audioBitsPerSecond: 128000, mimeType: "audio/ogg; codecs=opus" });
  Recorder.start(5000); 
  Recorder.addEventListener("dataavailable", function(event) {
    const audioBlob = new Blob([event.data], { type: 'audio/ogg' });
    upload(audioBlob);
  });
});

但只有第一部分可以播放。我能做什么,或者如何使所有斑点都可以播放? 我必须录制然后上传每个片段。我无法制作 blob 数组(因为用户可以记录 24 小时甚至更多的数据,并且在用户记录时需要将数据上传到服务器 - 有 5 秒的延迟)。

谢谢你!


您必须了解媒体文件是如何构建的。
它不仅仅是一些可以直接转换为音频或视频的原始数据。

这取决于所选的格式,但基本情况是您拥有所谓的格式metadata它们就像一本描述文件结构的字典。

These metadata对于随后读取文件的软件来说,这些信息是必要的,以了解它应该如何解析文件中包含的实际数据。

MediaRecorder API 在这里处于一个奇怪的位置,因为它必须能够同时写入这些metadata,并添加未确定的数据(它是live录音机)。

所以发生的情况是浏览器会将 mainmetadata在文件的开头,他们将能够简单地将新数据推送到文件,并且仍然是一个有效的文件(即使某些信息(例如持续时间)会丢失)。

现在,你得到了什么datavailableEvent.data只是正在生成的整个文件的一部分。
第一个通常包含metadata以及一些其他数据,具体取决于事件被告知触发的时间,但接下来的部分不一定包含任何元数据。

因此,您不能仅将这些部分作为独立文件获取,因为生成的唯一文件是由所有这些部分组成的文件,这些部分连接在一起形成一个 Blob。


因此,对于您的问题,您有不同的可能方法:

  • 您可以将一段时间内从记录器获得的最新切片发送到服务器,并在服务器端合并这些切片。

    const recorder = new MediaRecorder(stream);
    const chunks = [];
    recorder.ondataavailable = e => chunks.push(e.data);
    recorder.start(); // you don't need the timeslice argument
    setInterval(()=>{
      // here we both empty the 'chunks' array, and send its content to the server
      sendToServer(new Blob(chunks.splice(0,chunks.length)))
    }, 5000);
    

    在服务器端,您可以将新发送的数据附加到正在录制的文件中。

  • 另一种方法是生成许多小的独立文件,为此,您可以简单地在一个时间间隔内生成一个新的 MediaRecorder:

    function record_and_send(stream) {
       const recorder = new MediaRecorder(stream);
       const chunks = [];
       recorder.ondataavailable = e => chunks.push(e.data);
       recorder.onstop = e => sendToServer(new Blob(chunks));
       setTimeout(()=> recorder.stop(), 5000); // we'll have a 5s media file
       recorder.start();
    }
    // generate a new file every 5s
    setInterval(record_and_send, 5000);
    

    这样做,每个文件将是独立的,持续时间约为 5 秒,您将能够逐个播放这些文件。
    现在,如果您只想在服务器上存储单个文件,仍然使用此方法,您也可以在服务器端将这些文件合并在一起,例如使用类似的工具ffmpeg.

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

使用MediaRecorder录制5秒的音频片段,然后上传到服务器 的相关文章

  • Haxe for javascript 没有全局命名空间污染?

    此问题仅适用于 Haxe 版本 我知道 haxe 一段时间了 但直到昨天才真正使用过它 出于好奇 我决定移植对决 js http wmd editor com examples splitscreen 一个 javascript 端口降价
  • 为什么我必须将所有脚本放入 jquery mobile 中的index.html

    我在我的phonegap jquerymobile 项目中使用 mobile changepage 进行重定向 然而让我困惑的是我需要将所有页面的脚本放在同一个文件index html中 如果不是 则重定向页面无法执行其标头中的函数 例如
  • 获取语​​音通道的用户数

    我正在重写我的音乐部分朋友不和谐机器人 https top gg bot 629799045954797609 我试图弄清楚如何获取执行命令的人的语音通道中的用户数量 我到处都找过 但似乎找不到它或它的用法 现在我正在使用以下内容 modu
  • 粘性页脚不粘在 AngularJS 中

    Im working an angular site and im trying to implement a sticky footer across all views but the footer stops sticking whe
  • 如何使用 Javascript 将 HTML 表单数据输出到 XML 文件?

    我目前正在尝试弄清楚如何将 HTML 表单数据输出到 XML 文件 这是我过去几天一直在研究的一个想法 目的是创建一个用于 Windows 7 安装的 autounattended xml 文件 目前我的 HTML 如下
  • 为什么我无法使用 HTML5 音频标签多次播放声音?

    这就是声音的 存储 方式
  • LeafletJs只显示一个国家

    我使用 Leafletjs 和 D3 来显示地图 我只想在地图上显示英国 Leaflet和D3是否可以只显示英国 这当然是可能的 现在的解决方案取决于您是想使用 D3 绘制英国 还是想从 Tile Server 获取它 在后一种情况下 有一
  • 在生产中使用 css / javascript 源映射对性能有何影响?

    生产环境中应该使用源映射吗 除了调试之外 它们还有什么好处吗 由于额外的服务器往返 它们是否会影响应用程序加载时间 浏览器是否足够智能来加载 map应用程序加载和渲染后的资产 如果浏览器找不到 map asset 404错误 会对性能产生影
  • javascript中.match和.test有什么区别[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 在浏览 JavaScript 时 我刚刚遇到了 match test 和 exec有什么不同 这是最快的 首先 exec and test
  • console.log 是如何工作的?

    第一个例子 在以下示例中 http jsfiddle net maniator ScTAW 4 http jsfiddle net maniator ScTAW 4 我有这个js var storage function var store
  • HTML5 Audio Element 无法在 IOS 11 设备上的 safari 中播放 mp3 直播

    我是一家广播公司的网络开发人员 自 iOS 11 发布以来 我们收到了一些用户投诉 称我们的音频直播流无法再在 IOS 11 设备上播放 为了将流嵌入我们的网站 我们使用 HTML5 AudioElement 在 iOS 11 的 iPho
  • Antd datepicker (date.clone/date.load 不是函数)

    我有一个反应应用程序 有一个复选框可以禁用日期选择器 但当我使用复选框禁用它时 我无法选择任何日期 如果我删除复选框及其功能 则不会出现错误 目前 我得到 date clone 不是函数 error const dateFormat YYY
  • 当 eslint 从子文件夹运行时无法解析相对模块路径

    当我从存储库的根文件夹运行 eslint 时 一切运行正常 没有错误 但是当我从子文件夹运行时 我会得到大量导入 未解决的问题 而当我从根目录运行时则不会发生这种情况 reporoot subfolder0 subfolder1 MyFil
  • 需要将焦点放在react中的div上

    我有一个之前用 H1 标签包裹的文本 页面加载后 我需要专注于该文本 为了方便起见 我将它包装在 div 中 render const translate billing primaryContactSelection true this
  • 如何列出特定服务器的所有成员?

    我的代码是 const list client guilds find id 335507048017952771 for user of list users console log user 1 username 这实际上没有任何作用
  • bootstrap-datetimepicker 仅显示日期

    我正在用这个repo https github com smalot bootstrap datetimepicker由 smalot 提供 我只想选择并显示日期 对于其他一些地方 我显示数据和时间 因此选择此存储库 我可以设法仅使用它来选
  • EaselJS Alpha 遮罩滤镜

    我对 Canvas 还很陌生 我一直在尝试将图像颠倒过来EaselJS Alpha 蒙版 http www createjs com demos easeljs alphamaskreveal示例 以便初始图像清晰 并且您可以paint是模
  • Chrome 和 IE 上的滚动/延迟事件

    我试图让用户始终看到一个内容块 即使他向下滚动页面也是如此 他还应该能够上下滚动内容块 这是一个精简版本的小提琴 向您展示我的意思 http jsfiddle net 9ehfV 2 http jsfiddle net 9ehfV 2 人们
  • ExtJS:简单表单忽略 formBind

    我有一个小问题让我发疯了好几天 我有一个表单面板 Ext define EC view PasswordPanel extend Ext form Panel alias widget pwdpanel bodyPadding 15 ini
  • 如何使用 jquery 生成并附加随机字符串

    一般性 我想使用 jQuery 或 javascript 将随机字符串附加到元素的属性 规格 我需要引用 CDN 上的 CSS 文件 不幸的是 每次更新该 CSS 文件时 CDN 都会更改该文件的 URL 所以我不能简单地引用静态 URL

随机推荐

  • PHP:如何识别并更改数组中的重复值?

    好的 在 php 数组中有很多重复检测和删除的示例 使用 array unique 等 但是如果您想查找重复项 修改它们 再次循环检查直到所有重复项现在都是唯一的 该怎么办 我认为这就像使用 array filter 所以作为一个更具体的示
  • TFS:构建具有多种配置的解决方案

    设想 在 TFS 2013 上 我必须构建 300 多个项目 C 和 VC 分为大约 40 个解决方案 有些项目有多个发布和调试配置 例如一个项目可能有 3 个发布配置 如版本 1 版本 2 版本 3 x86 版本 4 x64 等 要求 我
  • 这是使用 Python 3 unittest 测试 stdout 的正确方法吗?

    假设我有一个提交文件 fileFromStudent py 其中唯一的内容是 print hello world 我想测试标准输出 看看学生是否正确写出了打印语句 根据我所读到的内容 我已经能够创建以下代码 from io import S
  • 序列化多态接口

    我希望从其关联的接口序列化一个多态类 这是我发现的这个问题 它似乎做了我需要做的事情 如何在Boost Serialization中创建序列化接口 然而 序列化是从类本身而不是接口完成的 到目前为止我得到了什么 网络消息 hpp using
  • 可以知道变量所在的内存部分吗?

    C 程序中有什么方法可以知道变量所在的部分吗 例如 char str Word1 char str2 Word2 printf String1 s Location p n str str lt would be on the stack
  • java 如何打印经过的时间(秒)

    在游戏循环的 run 方法中 我尝试打印程序在 java 中运行的时间 我只是尝试过System out println System nanoTime 1000000 因为这就是一秒有多少毫秒 如果您不知道 它会打印接近尾声的秒数 但我想
  • 角度2错误httpclientmodule

    have some error with httpclientmodule i have app module ts and there is code import NgModule from angular core import Br
  • SVG 填充颜色透明度/alpha?

    是否可以在 SVG 填充颜色上设置透明度或 Alpha 级别 我尝试向填充标签添加两个值 将其从fill 044B94 to fill 044B9466 但这不起作用 您使用附加属性 fill opacity 该属性采用 0 0 到 1 0
  • Windows Phone 键盘打开事件和属性

    在我的 Windows Phone 应用程序上 我需要根据键盘更改视图 我有几个问题 如何判断键盘是否打开 是否有键盘打开的视图事件 有没有办法获得键盘的高度 或者被阻止的 UI 区域大小 通过键盘 您可以通过以下方式访问键盘信息Windo
  • 使用 SWIG 作为参数传递给 C 库的错误值

    跟随我的three previous posts 我现在可以将托管结构数组传递给我的包装方法 以下是文件的摘录 packer i typedef struct int width input int height input frame t
  • VBA Excel/Word 查找和替换

    我正在开发一个 Excel 工作表 用于在 Word 文档中搜索特定实例 A 列 并将其替换为单元格 B 中的实例 我只想更改与搜索条件匹配的第一个实例 并继续循环该列到下一个实例 我写了下面的代码 如果我使用 wdReplaceAll 它
  • Rstudio 控制台中的命令行错误

    如何将一个很长的字符串分配给r中的变量 以下工作正常 testVar lt test test 但以下给出了一个奇怪的 在 RStudio 控制台中 testVar lt test test test test test test test
  • 检索 x509 证书的序列号时缺少前导零

    我正在尝试从 X 509 证书获取序列号 当我将代码生成的序列号与实际序列号 在 Windows 上 进行比较时 实际序列号 X509 证书 的前导零是丢失的 有任何建议或替代方法来获取带有前导零的十六进制 x 509 证书的序列号吗 以下
  • MVC 异步错误 - 异步操作方法“Complete”无法同步执行

    我正在将 MVC4 与 VS 2010 一起使用 我有一个正在尝试运行的异步操作 我的控制器继承自 AsyncController 并且我有 Async 和 Completed 方法 我能够在示例测试项目中正确执行异步操作 但是当我将它作为
  • 具有自定义内容模板的 WPF 创建按钮

    我在 WPF 中有一个应用程序 需要创建许多具有相同内容布局的按钮 目前它在 Window 中定义为
  • Office365 REST API - 日历事件附件对收件人不可见

    The 添加附件端点似乎有问题 附加到日历事件的文件are not对日历收件人可见 附件are对事件创建者可见 直到最近 我的代码已经运行了几个月 这让我相信这是一种回归 重现步骤 必须有两个用户 创建者和接收者 通过创建事件https g
  • 启用 openmp 时出错 - “ld: 找不到 -lgomp 的库”和 Clang 错误

    我试图让 openmp 在 Mavericks 上的程序中运行 但是当我尝试使用标志进行编译时 fopenmp我收到以下错误 ld library not found for lgomp clang error linker command
  • 从内核模块创建 sysfs 条目

    我想将一个大于 1024 个字符的字符串传递给我的模块 文件系统 由于内核参数限制为 1024 个字符 有人推荐使用 sysfs 代替 我试图包括这个例子在我的 super c 类中为我的模块在 sysfs 中创建字符串 文件名 和字符串
  • 如何获取当前 EST 时间 IOS Swift

    我需要比较我的应用程序中的两个日期 并且我有一个 EST 日期与当前日期进行比较 但是let today NSDate 返回 UTC 日期 我如何获取当前 EST 时间或转换为 EST The NSDate以绝对时刻存储时间 即无论您使用时
  • 使用MediaRecorder录制5秒的音频片段,然后上传到服务器

    我想录制用户麦克风 5 秒长的片段并将每个片段上传到服务器 我尝试使用 MediaRecorder 并以 5 秒的时间间隔调用 start 和 stop 方法 但是当我连接这些录音时 之间会发出 滴 声 所以我尝试使用 start 方法的