如何将Int16Array缓冲区保存到wav文件节点js

2023-12-20

我在音频处理时将 ​​Int16Array 缓冲区发送到服务器

var handleSuccess = function (stream) {
        globalStream = stream;
        input = context.createMediaStreamSource(stream);
        input.connect(processor);

        processor.onaudioprocess = function (e) {
            var left = e.inputBuffer.getChannelData(0);
    var left16 = convertFloat32ToInt16(left);
    socket.emit('binaryData', left16);
        };
    };

    navigator.mediaDevices.getUserMedia(constraints)
        .then(handleSuccess);

在服务器中我尝试保存文件如下

client.on('start-audio', function (data) {
        stream = fs.createWriteStream('tesfile.wav');
    });

    client.on('end-audio', function (data) {
         if (stream) {
            stream.end();
         }
         stream = null;
    });

    client.on('binaryData', function (data) {
        if (stream !== null) {
            stream.write(data);
        }
    });

但这不起作用,那么我如何将此数组缓冲区保存为 wav 文件?


在O/P问题上,尝试将数据直接写入和添加到现有文件中,但这是行不通的,因为WAVE文件需要有一个标头,而仅仅创建一个写文件流是不可能有标头的使用createWriteStream。您可以在此处检查该标头格式“WAVE PCM 声音文件格式” http://soundfile.sapp.org/doc/WaveFormat/.

有的是wav https://www.npmjs.com/package/wavNPM包可以帮助处理将数据写入服务器的整个过程。它有FileWriter https://www.npmjs.com/package/wav#filewriterpath-options类创建一个能够正确处理 WAVE 音频数据的流,并在流结束时写入标头。

1. 创建一个 WAVEFileWriter继续播放start-audio event:

// Import wav package FileWriter
const WavFileWriter = require('wav').FileWriter;

...

// Global FileWriter stream.
// It won't handle multiple client connections; it's just for demonstration
let outputFileStream;

// The UUID of the filename that's being recorded
let id;

client.on('start-audio', function() {
  id = uuidv4();

  console.log(`start-audio:${id}`);

  // Create a FileWriter stream using UUID generated for filename
  outputFileStream = new WavFileWriter(`./audio/recs/${id}.wav`, {
    sampleRate: 16000,
    bitDepth: 16,
    channels: 1
  });
});

2.使用我们创建的流写入音频数据binaryData event:

client.on('binaryData', function(data) {
  console.log(`binaryData:${id}, got ${data ? data.length : 0} bytes}`);

  // Write the data directly to the WAVE file stream
  if (outputFileStream) {
    outputFileStream.write(data);
  }
});

3. 当我们收到消息时结束流end-audio event:

client.on('end-audio', function() {
  console.log(`end-audio:${id}`);

  // If there is a stream, end it.
  // This will properly handle writing WAVE file header
  if (outputFileStream) {
    outputFileStream.end();
  }

  outputFileStream = null;
});

我用这个例子创建了一个 Github 存储库,你可以在这里找到:https://github.com/clytras/node-wav-stream https://github.com/clytras/node-wav-stream.

请记住,处理这样的数据会导致问题,因为使用此代码,只有一个FileWriter每个连接的客户端的流变量。您应该为每个客户端流创建一个数组,并使用客户端会话 ID 来存储和标识属于相应客户端的每个流项目。

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

如何将Int16Array缓冲区保存到wav文件节点js 的相关文章

随机推荐

  • Google 脚本 .setFormula 字符串值错误[重复]

    这个问题在这里已经有答案了 我是新手 所以请原谅这个简单的问题 我正在尝试将以下公式插入 google 工作表 L2 R1 最终产品的单元格 E18 中 if D17 Poor 0 if D17 Acceptable 1 if D17 Ex
  • 如何将控制台和文档上的内置方法分配给javascript中的变量?

    我正在尝试将 console log 方法的条件分配实现为变量 如下所示 var dbglevel 1 var dbg dbglevel gt 0 console log function dbg message throws TypeEr
  • 初始化(复杂)静态数据成员的 Pythonic 方法

    我有一个包含复杂数据成员的类 我想保持 静态 我想使用函数初始化一次 Pythonic 是这样的 def generate data do some analysis and return complex object e g list c
  • sudo Kill 导致权限被拒绝

    ps 辅助 grep 节点结果 root 2814 0 0 0 0 4344 0 S Mai27 0 00 sh c node node modules webpack dev server bin webpack dev server j
  • 宏定义

    我尝试定义一个宏 其功能如下 调用 1 没有问题 但调用 2 提示编译器错误 因为第三个参数不可用 如何定义一个同时支持调用1和调用2的宏 define RDF LOG dbglevel fmt rdfDBG dbglevel fmt VA
  • 如何获取未缓存的数据?

    当我尝试与数据交互时 会抛出错误 const user client users cache get user id user send message 类型错误 无法读取未定义的属性 发送 缓存实用程序说明 缓存是一个收藏 https d
  • 如何使用 sed 删除双换行符?

    I tried sed i s n n file 但它不起作用 我仍然想要单行中断 Input abc def ghi jkl 期望的输出 abc def ghi jkl 这可能对你有用 GNU sed sed a N s n ta fil
  • 混合应用程序取决于服务器端补丁

    我想制作一个混合应用程序 可以像网站一样经常修补并立即反映 原生应用每次都需要花费太多时间才能获得商店的批准 因此搜索了 Cordova Xamarin React Native 等 但不确定哪一个最适合我 我不会使用复杂的函数或逻辑 也不
  • 使用“strstr”在字符串中搜索多字节 UTF-8 字符是否安全?

    按照我之前的问题 尽管手册页有免责声明 为什么 strchr 似乎可以使用多字节字符 https stackoverflow com q 25566356 3194340 我发现strchr是一个糟糕的选择 相反 我正在考虑使用strstr
  • PHP正则表达式验证

    只是一个简单的问题 我对正则表达式有点垃圾 所以我想我会在这里发布 下面的正则表达式用于验证用户名 长度必须在 4 26 个字符之间 至少以 2 个字母开头 只能包含数字和一 下划线和一个点 到目前为止我有这个 但不起作用 谢谢 你可以使用
  • 为什么  出现在我的 HTML 中? [复制]

    这个问题在这里已经有答案了 我在 Firebug 中看到这个角色 65279 我不知道为什么会发生这种情况 我的代码中没有这样的字符 对于 Firefox 来说还可以 但是在 IE 中一切都会崩溃 我什至无法在谷歌中搜索到这个角色 我用没有
  • 无法在沙箱上找到 paypal 付款按钮创建

    我有两个沙箱贝宝帐户 买家和企业 卖家 最近我添加了一个从 PayPal 生成的 html 作为 立即购买 按钮 它看起来效果很好 现在我想添加沙盒按钮来测试该过程 但登录到我的沙盒帐户后 我看不到任何创建付款按钮的选项 就像我的常规帐户中
  • 自定义形状周围的 CSS 框阴影?

    你好 我需要创建一个如下所示的 div 到目前为止我想出的是 http jsfiddle net suamikim ft33k http jsfiddle net suamikim ft33k bubble position relativ
  • 防止 Kivy 留下调试消息

    我有一个简单的 Kivy 界面 也使用终端 示例代码 import kivy kivy require 1 0 6 from kivy app import App from kivy uix label import Label clas
  • 如何在 vue cli 中使用 Moment.js

    我已经 npm 安装了 vue moment 我需要通过 for 循环将日期传递给 p 标记 还我需要创建一个方法我可以在其中添加天数到我的日期 以便它显示该天数之后的日期 我该怎么做或者我错在哪里 main js代码 Vue use re
  • 从另一个文件导入和更改变量

    Okay 我一直在寻找可以直接回答我的问题的答案 但没有成功 我的问题非常简单 老实说我认为会有更直接的答案 请记住 我对这门语言还比较陌生 并且仍在学习中 所以我会用fileA and fileB作为我的两个文件 以及x作为我的示例变量
  • “应用程序安装失败。发生运行时错误。修复 App Manifest.xml 文件中的功能。”

    我正在为 WP8 构建这个简单的应用程序 一切都工作正常 直到今天我必须向清单文件添加新功能以允许访问传感器 我只是用图形编辑器打勾ID CAP SENSORS 现在 每次我尝试部署我的应用程序时 我都会得到 Installation of
  • SQLSTATE[HY000] [2002] yii2 中没有这样的文件或目录

    I use ubuntu 16 04 PHP Version 7 0 4 7ubuntu2 Apache 2 4 18 Ubuntu PHP extension mysqli 在 phpmyadmin 中写的 我从升级我的ubuntu15
  • WifiP2pManager.discoverPeers 在 android 10 中失败

    以下代码示例返回Error code 0 这是android中内部错误的错误代码 是否有任何解决方法可以在 Android 10 设备中发现对等点 wifip2pmanager discoverPeers wifip2pmanagerCha
  • 如何将Int16Array缓冲区保存到wav文件节点js

    我在音频处理时将 Int16Array 缓冲区发送到服务器 var handleSuccess function stream globalStream stream input context createMediaStreamSourc