2016-08-02 15 views
0

Im Anschluss an reicht von Node - how can i pipe to a new READABLE stream?node.js - eine neue Readstream für eine neue Datei erstellen, wenn die Datei eine bestimmte Größe

Ich versuche, eine neue ReadStream für meine Live-kodierte MP3-Datei zu starten, wenn es sich um ein erreicht bestimmte Größe (pre-Pufferung im wesentlichen) durch fs.watch und fs.stat verwenden.

Es funktioniert, aber sobald die ReadStream begonnen hat, ich weiß nicht, wie die Beobachter zu beenden und den Strom am Laufen zu halten.

ich ein Versprechen, wie unten versucht habe, aber das ist nie gelöst, so streamEncodedFile wiederholt aufgerufen wird:

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 }); 
      }); 

} 

Mein anderer erbärmlicher Versuch ist nur den Strom bei einer bestimmten Dateigröße zu versuchen und zu starten:

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 ('Veränderung', (event, Pfad) => { fs.stat (mp3RecordingFile, Funktion (err, Statistiken) { if (stats.size> 75533) { streamEncodedFile();} }); }); Funktion streamEncodedFile() { var mp3File = fs.createReadStream (mp3RecordingFile); mp3File.on ('Daten', Funktion (Puffer) { io.sockets.emit ('Audio', { Puffer: Puffer }); }); watcher.close(); } ' – dottodot

+0

Danke. Ich hätte sagen sollen, dass ich das versucht habe, aber der ReadStream endete. Das glaube ich deshalb https://github.com/jasontbradshaw/tailing-stream – user3174541

Antwort

0

Versuchen Sie diese Lösung, mit Pufferung und Schreiben in Datei.

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

Kann dies nicht versuchen warten. Danke noch einmal! – user3174541

+0

Hallo * wieder * @Nazar Sakharenko. Ich verstehe nicht, warum Sie an den Puffer mit '+ =' hängen. Die Chunks sind ArrayBuffer-Objekte und müssen auf diese Weise am anderen Ende decodiert werden. Sollten wir 'buffer.push (chunk)' nicht machen? Dann muss ich das Array irgendwie wiederholen, um zu beginnen, die ursprünglichen ArrayBuffers von ihm zu senden. Es sei denn, ich vermisse etwas. Vielen Dank! – user3174541

+0

Nein, ich habe nur vergessen, dass Sie den Puffer manipulieren. Antwort aktualisiert –

Verwandte Themen