2016-05-11 16 views
0

Ich habe einen Nodejs Server mit Express (Express 4) ausgeführt. Ich möchte das Video von einigen IP-Kameras in einem Labor auf Anfrage speichern. Alles funktioniert, aber wenn das Video zu lang ist, wird es nicht gespeichert (das Limit scheint 11M zu sein).nach 10M ffmpeg stoppt das Speichern von Video auf Nodejs

Ich habe versucht, nur über die Befehlszeile:

ffmpeg -i rtsp://192.168.1.189:554/ch01_sub.264 -strict -2 -vcodec 
copy -vcodec copy test.mp4 

und das funktioniert. Aber ich in Schwierigkeiten geraten, sobald ich Knoten verwenden (. Beachten Sie, dass diese im Knoten-Parser ist, kein Code in ausdrücklich ich die gleichen Fehler, wenn der Server ausgeführt wird):

var child_process = require('child_process'); 
tmpProcess = child_process.spawn('ffmpeg',['-i','rtsp://192.168.1.189:554/ch01_sub.264','-strict','-2','-vcodec','copy','-vcodec','copy',"test.mp4"],{maxBuffer: 10000}); 

dies läuft bis test.mp4 ist ungefähr 11M. tmpProcess wird nicht beendet, es läuft weiter. Aber nachdem test.mp4 eine bestimmte Größe hat, kann ich es nicht wiedergeben. Ich erhalte den Fehler "Diese Datei enthält keine abspielbaren Streams." (Dies ist von Totem, aber VLC funktioniert auch nicht).

Das Ändern von maxBuffer hilft nicht. Ich versuche zu verstehen, welchen Puffer ich überflute, aber ich kann nicht viel Info vom Handbuch auf der API des Knotens erhalten.

+1

Generiert die Standalone-Version des Befehls viel (Debugging?)? Wenn dies der Fall ist, müssen Sie wahrscheinlich 'tmpProcess. {Stdout, stderr}' lesen (indem Sie beiden einen 'data' Event Listener hinzufügen) oder' stdio: 'ignore' als Option verwenden. Es sieht so aus, dass 'maxBuffer' nicht für' .spawn() 'verwendet wird. – robertklep

+0

Sie hatten Recht! Warum schreibst du das nicht als Antwort? Du hast die Frage beantwortet. – cauchy

Antwort

1

Wenn ffmpeg viel (Debugging) Ausgabe erzeugt auf stdout/stderr, müssen Sie sicherstellen, dass es gelesen wird, oder, die Sie child_process.spawn() mit der Option { stdio : 'ignore' } nennen.

Sonst sammelt Node die Daten weiter und blockiert irgendwann (zumindest, denke ich) den erzeugten Prozess, bis alle Daten gelesen sind.

Um die Daten zu lesen, hängen Sie data Event-Listener an tmpProcess.stdout und tmpProcess.stderr an. Oder verwenden Sie die oben genannte ignore, damit Knoten alle Ausgaben ignorieren (was in Ihrem Fall wahrscheinlich die beste Lösung ist, da Sie nicht an der Konsolenausgabe interessiert sind).

Verwandte Themen