具有增益控制的 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 是啥?
如何基于 ZEGO SDK 实现回声消除自动增益控制降噪功能