【问题标题】:Mp3 audio in node.js with gain control具有增益控制的 node.js 中的 Mp3 音频
【发布时间】: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 的一项功能。 :)

标签: node.js audio stream node-speaker node-lame


【解决方案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()

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多