2017-08-23 4 views
1

ich große Mediendateien in Node.js manipulieren derzeit eine Node.js App erschaffe, die einen Audio/Video-Stream empfängt, schreibt er schrittweise auf die Platte, dann transkodiert es mit ffmpeg einmal die Der Stream ist beendet und sendet ihn an einen anderen Ort, um ihn lokal zu löschen.Wie in einer nicht blockierenden Weise

Neben der Tatsache, dass ich den Stream vor dem Schreiben umwandeln kann, um die gesamte Sache zu rationalisieren (diese Funktion ist geplant), was ist der beste Weg, um diese Operationen auf potenziell große Dateien zu behandeln?

Ich bin mir bewusst, Kindprozesse von spawing (die Methode, die ich zur Zeit bin mit), aber ich bin nicht sicher, wie sie eigentlich funktioniert, auch nach viel zu lesen. Ich bin nicht einmal sicher, ob ich "spawn" verwenden soll, was ich hier möchte (ist "fork" eine bessere Option?).

Im Grunde möchte ich wissen, wie umcodieren -> Upload -> löschen Sie die Datei ohne Node.js blockiert, so dass mehrere Benutzer gleichzeitig das gleiche tun können. Außerdem denke ich daran, alle 3 Operationen in ein einziges Bash-Skript zu schreiben, so dass sie synchron nacheinander ablaufen, ist das in Ordnung?

Antwort

1

der richtige Weg, dies zu handhaben ist Streams zu verwenden - ein in der Klasse in NodeJS gebaut.

Ströme ermöglichen Leitungsdaten nach und nach und auf 1 Brocken zu einem Zeitpunkt zu tun Arbeit. Dadurch können Dateien bearbeitet werden, die größer sind als der Arbeitsspeicher des Computers oder endlose Datenströme wie in Ihrem Fall.

Anstatt die Daten auf die Festplatte zu schreiben, können Sie sie im laufenden Betrieb verarbeiten, ohne den Thread zu blockieren (kann mehrere Streams gleichzeitig transcodieren).
Sie haben keinen Code geteilt, aber hier ist ein allgemeines Beispiel.

const spawn = require('child_process').spawn; 

const ffmpeg = spawn('ffmpeg -y -hide_banner -f mpegts -i pipe: -codec copy -f mpegts pipe:'); 
ffmpeg.stdout.on('data', chunk => { 
    // upload a transcoded chunk 
}); 

// if the source is also a stream you can pipe it directly like so 
// sourceStream.pipe(ffmpeg.stdin); 

function onAudioVideoChunkReceived(chunk) { 
    // handle audio/video input to nodejs server 
    ffmpeg.stdin.write(chunk) 
} 

Beachten Sie die Verwendung der speziellen Eingabe/Ausgabe pipe: von ffmpeg, die ermöglicht Rohr Eingang und Ausgang durch stdin und stdout

+0

Vielen Dank, aber Umcodierung on-the-fly ist weniger meine Sorge für den Moment als zu verstehen, ob Spawn die Event-Schleife hält, während - sagen wir - die Datei transcodiert wird. Im Grunde möchte ich wissen, ob es möglich ist, für mehrere Benutzer zu diesem Node.js-Server verbinden ich gemacht hat, wo die Dateien in einem Kind-Prozess unter Verwendung von Laich umcodiert werden, oder wird der Node.js Prozess (ohne Berücksichtigung der externen Grenzen gehalten werden, wie Speicher verfügbar und so)? –

+0

Es blockiert den Thread nicht und Sie können mehrere Pipes gleichzeitig ausführen. bearbeitete die Antwort, um das zu reflektieren. offensichtlich skaliert dies nur bis zu einem Punkt, wo Ihre CPU/Speicher/Netzwerk gesättigt sind. – MrBar

+0

Danke, genau das wollte ich wissen! –

Verwandte Themen