2016-05-18 13 views
0

Ich verwende das lame-Paket [1], um einige MP3-Daten in eine Datei zu schreiben. Die Daten werden als Rohaudio auf einem Socket gesendet und wenn es empfangen wird, wird es in einen Dateistrom geschrieben und alle 10 Minuten schreibe ich in eine neue Datei. Das Problem, das mir bevorsteht, ist, dass das System, wenn es für eine lange Zeit läuft, keine Dateihandles mehr hat, weil die Datei nicht geschlossen ist. Etwas wie dieses:Wie wird eine Datei beim Schreiben geschlossen?

var stream; 

var encoder = lame.Encoder({ 
    // Input 
    channels: 2, 
    bitDepth: 16, 
    sampleRate: 44100, 

    // Output 
    bitRate: 128, 
    outSampleRate: 22050, 
    mode: lame.STEREO // STEREO (default), JOINTSTEREO, DUALCHANNEL or MONO 
}); 

encoder.on('data', function(data) { 
    stream.write(data); 
}); 

var server = net.createServer(function(socket) { 
    socket.on('data', function(data) { 

    // There is some logic here that will based on time if it's 
    // time to create a new file. When creating a new file it uses 
    // the following code. 
    stream = fs.createWriteStream(filename); 

    // This will write data through the encoder into the file. 
    encoder.write(data); 

    // Can't close the file here since it might try to write after 
    // it's closed. 
    }); 
}); 

server.listen(port, host); 

Wie kann ich jedoch die Datei schließen, nachdem der letzte Datenblock geschrieben wurde? Technisch kann eine neue Datei geöffnet werden, während die vorherige Datei noch den letzten Chunk schreiben muss.

Ist dieses Szenario, wie schließe ich die Datei korrekt?

[1] https://www.npmjs.com/package/lame

+0

was "Daten"? Lesbarer Stream oder Puffer? – KibGzr

+0

@KibGzr Es ist ein 'Puffer'. – Luke

Antwort

0

Sie benötigen Prozessdaten als Lesbare-Stream dann socket.io-Stream mit Ihrem Unternehmen zu lösen.

var ss = require('socket.io-stream'); 

//encoder.on('data', function(data) { 
// stream.write(data); 
//}); 

var server = net.createServer(function(socket) { 
    ss(socket).on('data', function(stream) { 

     // There is some logic here that will based on time if it's 
     // time to create a new file. When creating a new file it uses 
     // the following code. 
     stream.pipe(encoder).pipe(fs.createWriteStream(filename)) 
    }); 
}); 
0

Schließen der Strom (Datei), nachdem alle Schreib getan wird:

stream.end(); 

See-Dokumentation über: https://nodejs.org/api/stream.html

writable.end([chunk][, encoding][, callback])# 

    * chunk String | Buffer Optional data to write 
    * encoding String The encoding, if chunk is a String 
    * callback Function Optional callback for when the stream is finished 

Call this method when no more data will be written to the stream. If supplied, the 
callback is attached as a listener on the finish event. 
+0

Wie stelle ich fest, dass alles geschrieben wird? Das Schreiben in den Encoder erfolgt asynchron. I.e. Das Hinzufügen eines 'stream.end()' nach dem 'encoder.write (data)' wird fehlschlagen, da ich den Stream schließe, bevor die Daten geschrieben werden. – Luke

+0

@Luke: 'encoder.on ('end' ..)'? – slebetman

+0

Ich erkläre das Problem wahrscheinlich nicht sehr gut. Die Daten werden über einen bestimmten Zeitraum geschrieben. Es wird kein spezifisches 'encoder.end' ausgelöst. Bild, dass irgendwo zwischen 50 und 100 Datenblöcke geschrieben sind (es variiert). – Luke

Verwandte Themen