5

node.js でいくつかの mp3 ファイルを再生しようとしています。問題は、それらを1つずつ、または並行して再生することです。しかし、私が望んでいるのは、振幅 (ゲイン) を制御して、最終的にクロスフェードを作成できるようにすることです。私が何をする必要があるかを理解するのを手伝ってくれる人はいますか? (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)
})
4

1 に答える 1

0

そのために、npm パッケージのpcm-volumeをカスタマイズしました。クロスフェードするには、2 つの 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-02-03T11:25:40.610 に答える