6

私は基本的に、一連の mp3 ファイルを次々と再生したいと考えています。難しいことではありませんが、曲が再生された後、新しい mp3 データをフィードするためにデコーダーとスピーカー チャンネルを開いたままにしておくのに苦労しています。これは、私がこれまでに持っていたものの要約版で、1 つの mp3 ファイルを再生しています。

var audioOptions = {channels: 2, bitDepth: 16, sampleRate: 44100};

// Create Decoder and Speaker
var decoder = lame.Decoder();
var speaker = new Speaker(audioOptions);

// My Playlist
var songs = ['samples/Piano11.mp3','samples/Piano12.mp3','samples/Piano13.mp3'];

// Read the first file
var inputStream = fs.createReadStream(songs[0]);

// Pipe the read data into the decoder and then out to the speakers
inputStream.pipe(decoder).pipe(speaker);

speaker.on('flush', function(){
  // Play next song
});

私はTooTallNateのモジュールnode-lame(デコード用)とnode-speaker(スピーカーからのオーディオ出力用)を使用しています。

4

1 に答える 1

3

あなたが言及したモジュールの経験はまったくありませんが、曲を再生するたびにスピーカーを再度開く必要があると思います(デコードされたオーディオをパイプするため、デコーダーが完了するとスピーカーは閉じられます)。

コードを次のように書き直すことができます (未テスト)。

var audioOptions = {channels: 2, bitDepth: 16, sampleRate: 44100};

// Create Decoder and Speaker
var decoder = lame.Decoder();

// My Playlist
var songs = ['samples/Piano11.mp3','samples/Piano12.mp3','samples/Piano13.mp3'];

// Recursive function that plays song with index 'i'.
function playSong(i) {
  var speaker     = new Speaker(audioOptions);
  // Read the first file
  var inputStream = fs.createReadStream(songs[i]);
  // Pipe the read data into the decoder and then out to the speakers
  inputStream.pipe(decoder).pipe(speaker);
  speaker.on('flush', function(){
    // Play next song, if there is one.
    if (i < songs.length - 1)
      playSong(i + 1);
  });
}

// Start with the first song.
playSong(0);

別の解決策 (私が好むもの) は、非常に優れたasyncモジュールを使用することです。

var async = require('async');
...
async.eachSeries(songs, function(song, done) {
  var speaker     = new Speaker(audioOptions);
  var inputStream = fs.createReadStream(song);

  inputStream.pipe(decoder).pipe(speaker);

  speaker.on('flush', function() {
    // signal async that it should process the next song in the array  
    done();
  });
});
于 2013-06-04T21:12:00.057 に答える