NodeJS Videostream dynamisch erstellen

F

Fat32Tony

Gast
Nach einigem suchen nach einer Möglichkeit einen dynamischen Videostream zu erstellen bin ich nun auf nodejs gestoßen.

Mein Ziel ist es nun aus einer Anzahl an Frames ein Video zusammenzubauen welches dann an den Client gesendet werden soll.

Ich bin z.b. auf folgende Lösung gestoßen, welches allerdings auch nur eine fertige Videodatei zurückgibt.

Irgendwo anders wurde mal davon geredet doch einfach mjpeg zu streamen, doch ich bezweifle dass das funktioniert weil ich den jeweils nächsten frame ja mit php und Konsorten bereitstellen müsste.

Ich hoffe mal da hat jemand mehr Erfahrung als ich.
 
Du musst mehrere Einzelprobleme lösen:
1.) Wie generierst du das Video (das kostet in der Regel richtig fett CPU)
2.) Welches Format willst du haben (nicht alle (fast kein) Format lässt echtes Streaming zu, daher musst du da basteln)
3.) Zu welchem Endgerät soll das ganze gehen? HTML5-Video? Dann wohl mp4.

1.) ffmpeg kann echt viel, z.B. gepiped Bitmaps engegennehmen.
2.) mp4 ist ursprünglich nicht zum Streamen gemacht. TS wäre da der Container der Wahl (das könnte man unter Linux mit nem UNIX-Socket (und ffmpeg und co) wahrscheinlich auch relativ elegant lösen)
3.) Wie auf deinem Link zu lesen ist, musst du Ranges akzeptieren, dies wiederspricht aber dem Streaming-Prinzip (da kann man ja nicht spulen).

Falls du nur ein Video fertig rendern willst, lass den Nutzer warten, bis es fertig ist und verlinks dann wie jede normale Datei (oder mit HMTL5-video). Dann brauchst du nur ne Lösung, um asynchron zu rendern, da wäre Node-JS nicht so gut (kein Multithreading).
 
Hmmm OK.el
Könnte ich aus vorhandenen JPEG Bildern anhand eriner datenbank einen mjpeg stream erstellen?
Das würde doch eigentlich komplexe erneute rendervorgänge relativieren oder?
Funktioniert das über ffmpeg?
 
Hmm, ob das schnell geht, kann ich dir nicht sagen (kann man ffmpeg davon überzeugen, dass es nur ein remux ist? Ist die DB schnell genug?).
Laut http://de.wikipedia.org/wiki/Motion_JPEG ist das Format wirklich simpel, das heißt, du könntest in den Firefox tatsächlich in Echtzeit streame (Das ist allerdings HTTP-Getrickse).
Falls du tatsächlich MJPEG ausliefern möchtest, schein es nicht so einfach zu gehen, z.B. Microsoft hätte es gerne so: http://www.fileformat.info/format/bmp/spec/b7c72ebab8064da48ae5ed0c053c67a4/view.htm also nicht einfach mal "jpg an jpg".
 
Ok.
Also so Pakete wie der MJPEG-Streamer wollen anscheinend alle ein /dev/video* als Eingangssignal haben.
Hier wird von der Erstellung einer mjpeg Datei gesprochen, verwirrt mich allerdings weil als Output .avi angegeben wird

Erzeugen einer Motion JPEG (MJPEG) Datei aus allen im aktuellen Verzeichnis liegenden JPEG-Dateien:

mencoder mf://*.jpg -mf w=800:h=600:fps=25:type=jpg -ovc copy -oac copy -o output.avi

Selbst wenn die avi nur eine Kopie ist erkenne ich aus dem Befehl nicht wo ich meine mjpeg wiederfinden soll.

Edit:
So ok ich bin noch mal in mich gegangen und natürlich ist die AVI Datei das Ergebnis... Sorry bin grad sehr müde :)

Also mencoder erstellt mir brav aus jpg Dateien diese Avi. Das war allerings nicht ziel der Sache, eigentlich wollte ich ja ein dynamisches Video erstellen, also müsste diese AVI eigentlich fortlaufend erweitert werden...
 
Zuletzt bearbeitet:
Also falls du rumspielen willst:
Code:
 ffmpeg -y -f rawvideo -vcodec rawvideo -s <width>x<height> -pix_fmt rgb24 -r 30 -i - -c:v libx264 -profile:v high444 -crf 0 <outputfile>
Nimm von der Standardeingabe RGB24-Bilder mit width*height Größe an und kodiert das in ein h264 lossless Video (hab ich mal benutzt, um ein Videostream zu erstellen). Vielleicht gibt dir das ein Anstoß. (Wie das mit externen Prozessen in NodeJS geht, weiß ich nicht). Falls du das ganze streamen willst, musst du nur noch die Ausgabe genau kodieren (also Container mp4 (mit "-f mp4") und Codec MJPEG z.B. und auf STDOUT (mit "pipe:1") und dann den Ausgabestream auf den HTTP-Stream pipen und schon sollte es gehen (Hier z.B. .http://stackoverflow.com/questions/22167893/pipe-output-of-ffmpeg-using-nodejs-stdout) Wie die Performance aussieht, kann ich dir nicht sagen, aber zuerst Mal sollte es funktionieren, dann kann man sich über die Geschwindigkeit Gedanken machen.
 
Zurück
Oben