具有增益控制的 node.js 中的 Mp3 音频

Posted

技术标签:

【中文标题】具有增益控制的 node.js 中的 Mp3 音频【英文标题】:Mp3 audio in node.js with gain control 【发布时间】:2013-12-23 05:18:55 【问题描述】:

我正在尝试在 node.js 中播放一些 mp3 文件。问题是我设法一个接一个地播放它们,甚至按照我的意愿并行播放。但我还想要的是能够控制幅度(增益),以便最终能够创建交叉淡入淡出。谁能帮我理解我需要做什么? (我想在 node-webkit 中使用它,所以我需要一个基于 node.js 的解决方案,没有外部依赖。)

这是我目前得到的:

var lame = require('lame'), Speaker = require('speaker'), fs = require('fs');
var audioOptions = channels: 2, bitDepth: 16, sampleRate: 44100;
var decoder = lame.Decoder();


var stream = fs.createReadStream("music/ge.mp3", audioOptions).pipe(decoder).on("format", function (format) 
  this.pipe(new Speaker(format))
).on("data", function (data) 
  console.log(data)
)

【问题讨论】:

您想控制 DSP 的增益还是只使用操作系统的音量控制? 在 DSP 中,因为我想交叉淡入淡出两个音轨 如果你找到了,能否分享一下这个问题的解决方案?我现在面临同样的问题:-( @micha 怎么说。回答您自己的问题绝对是 Stack Overflow 的一项功能。 :) 【参考方案1】:

我定制了 npm 包 pcm-volume 来做到这一点。要交叉淡入淡出,请提供两个 pcm 音频缓冲区(解码器的输出)。将结果通过管道传送到您的 Speaker 对象。

这里是修改的主要部分。在这种情况下,交叉淡入淡出发生在所提供缓冲区的规模上,但您可以更改它。

var l = buf.length;
var out = new Buffer(l);

for (var i=0; i < l; i+=2) 
    volumeSunrise = 0.5*this.volume*(1-Math.cos(pi*i/l));
    volumeSunset  = 0.5*this.volume*(1+Math.cos(pi*i/l));
    uint = Math.round(volumeSunrise*buf.readInt16LE(i) + volumeSunset*this.sunsetBuffer.readInt16LE(i));
    // you may want to ensure that -32767 <= uint <= 32768 here, in case you use a volume higher than 1
    out.writeInt16LE(uint, i);


this.push(out);
callback()

【讨论】:

以上是关于具有增益控制的 node.js 中的 Mp3 音频的主要内容,如果未能解决你的问题,请参考以下文章

node.js 中 mp3 文件的 Content-Type 是啥?

如何在为音频会议混合音频时自动增益控制 (AGC)

如何基于 ZEGO SDK 实现回声消除自动增益控制降噪功能

使用 node js 实时流式传输 MP3 文件

将音频从浏览器流式传输到具有特定 MIME 类型的 node.js 服务器

node.js - 错误:ENOENT:没有这样的文件或目录,取消链接