2016-08-02 4 views
0

は、それが到達したとき、私は私のライブでエンコードされたMP3ファイルの新しいReadStreamを開始しようとしていますNode - how can i pipe to a new READABLE stream?Node.jsのは - そのファイルが

に続いて、特定のサイズに達すると、新しいファイルの新しいReadStreamを作成しますfs.watchfs.statを使用して特定のサイズ(本質的にバッファリング前)を指定します。

それは動作しますが、ReadStreamが起動した後、私はウォッチャーを終了し、ストリームの実行を継続する方法がわかりません。

私は以下のように約束を試してみたが、それが解決されることはありませんので、streamEncodedFileが繰り返し呼び出されます。

var watcher = fs.watch(mp3RecordingFile); 

watcher.on('change', (event, path) => { 

    fs.stat(mp3RecordingFile, function (err, stats) { 

    if (stats.size > 75533) { 

     new Promise(function(resolve, reject) { 
       streamEncodedFile(); 
     }) 
     .then(function(result) { 
       watcher.close(); 
       console.log('watcher closed'); 
     }); 

    } 

    }); 
}); 

function streamEncodedFile() { 

    var mp3File = fs.createReadStream(mp3RecordingFile); 

      mp3File.on('data', function(buffer){ 
       io.sockets.emit('audio', { buffer: buffer }); 
      }); 

} 

私の他の哀れな試みが唯一の特定のファイルサイズでストリームをしようとして開始することです:

watcher.on('change', (event, path) => { 

    fs.stat(mp3RecordingFile, function (err, stats) { 

    console.log(stats.size); 

    if (stats.size > 75533 && stats.size < 75535) { 
       streamEncodedFile(); 
    } else if (stats.size > 75535) { 
       watcher.close(); 
    } 

    }); 
}); 
+0

'var watcher = fs.watch(mp3RecordingFile); watcher.on( '変更'、(イベント、パス)=> { fs.stat(mp3RecordingFile、関数(ERR、統計){ IF(stats.size> 75533){ streamEncodedFile();} }); }); 関数streamEncodedFile(){ VAR mp3File = fs.createReadStream(mp3RecordingFile)。 mp3File.on( 'data'、function(buffer){ io.sockets.emit( 'audio'、{ バッファ:バッファ }); }); watcher.close(); } ' – dottodot

+0

ありがとうございます。私はそれを試みたと言っていたはずですが、ReadStreamが終了しました。これは私が信じている理由はhttps://github.com/jasontbradshaw/tailing-stream – user3174541

答えて

0

バッファリングとファイルへの書き込みを行うこのソリューションを試してください。

const Writable = require('stream').Writable; 
const fs = require('fs'); 

let mp3File = fs.createWriteStream('path/to/file.mp3'); 

var buffer = new Buffer([]); 
//in bytes 
const CHUNK_SIZE = 102400; //100kb 

//Proxy for emitting and writing to file 
const myWritable = new Writable({ 
    write(chunk, encoding, callback) { 
    buffer = Buffer.concat([buffer, chunk]); 
    if(buffer.length >= CHUNK_SIZE) { 
     mp3File.write(buffer); 
     io.sockets.emit('audio', { buffer: buffer}); 
     buffer = new Buffer([]); 
    } 

    callback(); 
    } 
}); 

myWritable.on('finish',() => { 
    //emit final part if there is data to emit 
    if(buffer.length) { 
     //write final chunk and close fd 
     mp3File.end(buffer); 
     io.sockets.emit('audio', { buffer: buffer}); 
    } 
}); 


inbound_stream.pipe(encoder).pipe(myWritable); 
+0

これを試して待つことができません。再度、感謝します! – user3174541

+0

こんにちは*もう一度@Nazar Sakharenko。なぜあなたが '+ ='でバッファに追加しているのか分かりません。チャンクはArrayBufferオブジェクトであり、もう一方の端でデコードされるようにそのままにする必要があります。私たちは 'buffer.push(chunk)'をしてはいけませんか?それから元のArrayBuffersを送信するように配列を何とか反復処理する必要があります。私は何かが欠けていない限り。ありがとう! – user3174541

+0

いいえ、私はあなたがバッファを操作することを忘れてしまった。回答が更新されました。 –

関連する問題