
Ich möchte ein Video aus SVG-Grafiken erstellen, die in einer Datenbank gespeichert sind. Um das zu archivieren, würde ich folgendermaßen vorgehen:
- Mit Datenbank verbinden
- Erstellen Sie einen ffmpeg-Befehl, der eine Pipe als Eingabe verwendet
- Erzeugen Sie den untergeordneten ffmpeg-Prozess.
- Warten Sie auf die Ausgabe des Prozesses.
Starten Sie einen anderen Thread: Führen Sie für alle SVG-Dateien Folgendes aus:
- Laden Sie das SVG aus der Datenbank in einen Byte-Puffer herunter
- Schreibe den Byte-Puffer in die Standardeingabe des untergeordneten ffmpeg-Prozesses
Beim Ausführen meines Codes tritt beim Weiterleiten der SVG-Dateien an ffmpeg ein Problem auf.
Ich habe verwendet ffmpeg -f image2pipe -c:v svg -i - -c:v libx264 -y Downloads/out.mp4
. Aber dann gibt ffmpeg mir den folgenden Fehler aus:
[image2pipe @ 0x562ebd74c300] Could not find codec parameters for stream 0 (Video: svg (librsvg), none): unspecified size
Consider increasing the value for the 'analyzeduration' (0) and 'probesize' (5000000) options
Ich habe herausgefunden, dass es svg_pipe
in ffmpeg ein Format gibt, also habe ich das versucht – ohne Erfolg, derselbe Fehler.
Eine andere Möglichkeit wäre, alle SVG-Dateien in ein temporäres Verzeichnis herunterzuladen und dann ffmpeg ohne Pipe zu verwenden, was bei meinem Versuch funktioniert hat. Der Befehl würde so aussehen: ffmpeg -i *.svg -c:v libx264 out.mp4
Aber in meinem Fall möchte ich das vermeiden.
Warum funktioniert der nicht gepipete Befehl und der gepipete Befehl (wie: cat sample.svg | ffmpeg -f svg_pipe -i - -c:v libx264 out.mp4
) schlägt fehl? Und wie kann ich in meinem Fall eine Pipe verwenden?
Meine aktuelle Lösung:
Ich verwende das -f rawvideo
Argument, um meine Grafiken an ffmpeg weiterzuleiten. Das ist eine funktionierende Lösung, setzt aber voraus, dass ich die SVG-Grafiken in das Roh-RGB-Format konvertieren muss. Ich habe diese Lösung von diesem übernommenAntwortauf Stackoverflow.
Antwort1
Durch einiges Ausprobieren gelang es mir, eine Reihe von Argumenten zu finden, die funktionieren:
cat sample.svg | ffmpeg -f svg_pipe -frame_size 1000000000 -video_size 100x100 -i - -c:v libx264 -y out.mp4
Wir können die Optionen des Demuxers erhalten, svg_pipe
indem wir den folgenden Befehl ausführen:
ffmpeg -h demuxer=svg_pipe
Ausgabe:
Demuxer svg_pipe [piped svg sequence]:
svg demuxer AVOptions:
-frame_size .D......... erzwingt Framegröße in Bytes (von 0 bis INT_MAX) (Standard 0)
-framerate <video_rate> .D......... stellt die Video-Framerate ein (Standard „25“)
-pixel_format .D......... stellt das Video-Pixelformat ein
-video_size <image_size> .D......... stellt die Videogröße
ein -loop .D......... erzwingt eine Schleife über die Eingabedateisequenz (Standard: false)
Aus irgendeinem Grund müssen wir -frame_size
das Argument so einstellen, dass es größer ist als die Größe der Eingabedatei.
Beachten Sie, dass der H.264-Codec keine Transparenz unterstützt, sodass die Ausgabe in den meisten Fällen seltsam aussehen wird (die Standardhintergrundfarbe ist schwarz).
Erwägen Sie, das SVG auf einen weißen Hintergrund zu legen.
Beispiel (mit FFmpeg Version n4.3.1 in Ubuntu 18.04):
Eingang:
https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/atom.svg