Wie kann ich FFmpeg verwenden, um einem Live-Video einen Ticker / variierenden Text hinzuzufügen?

3172
user763410

Ich kann einem Video auf meiner Festplatte Text hinzufügen, bevor ich es mit dem Befehl browse ...

ffmpeg -y -i IMG_0696.MOV -acodec libmp3lame -vcodec msmpeg4 \ -b:a 192k -b:v 1000k -ar 44100 \ -vf "drawtext=text=string1 string2 string3 string4 string5 string6 string7 :expansion=normal:fontfile=/Windows/Fonts/cambriai.ttf: y=0:x=h-(2*lh)-n: fontcolor=white: fontsize=40: box=1: boxcolor=0x00000000@1" \ -an IMG_0696.avi 

Nun möchte ich verschiedene Texte zu verschiedenen Zeitpunkten hinzufügen. Es sollte aus einer Datei gelesen werden, die das Format des Formats hat: Zum Beispiel

00:00:10: google 00:00:20: Yahoo 00:00:30: msft . . . 00:00:60: amzn . . . 00.05:30: java 

Gibt es eine Möglichkeit, dass ffmpeg die Datei lesen und zu bestimmten Zeiten Text hinzufügen kann? Schließlich möchte ich einem Video ein Live-Ticker-Symbol hinzufügen, bevor es übertragen wird.

2
Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, es "on the fly" zu machen, aber wenn Sie Text in verschiedenen Intervallen hinzufügen möchten, sollten Sie ein Untertitel-ähnliches Format wie .srt verwenden und direkt muxen, um einen MKV-Container zu sagen. Beispiel: `ffmpeg -i infile -i Untertitel.srt -scodec copy -acodec copy -vcodec copy outfile.mkv`. Srt-Format nachschlagen. Rajib vor 10 Jahren 0

1 Antwort auf die Frage

1
Breakthrough

Aus dem Quellcode des drawtextFilters (aus libavfilter/vf_drawtext.cdem Quellbaum) scheint ein textfileParameter zu bestehen, der einen Pfad zu einer Datei angeben kann, die die zu zeichnende Zeichenfolge enthält (im Gegensatz zur Einstellung des textParameters wie in Ihrem Beispiel). Sie können experimentieren, indem Sie einen Dateipfad als übergeben textfileund die Datei aktualisieren, während Sie die Videoausgabe anzeigen .

Sie benötigen auch ein anderes Programm / einen Daemon, der parallel läuft, um die Datei zu aktualisieren (die nur den aktuellen Text enthält, der angezeigt werden soll). Dieses Programm wäre jedoch ziemlich trivial, vorausgesetzt, Sie könnten es mit der Systemuhr synchronisieren.


Alternativ können Sie den drawtextFilter selbst so ändern, dass eine bestimmte Zeichenfolge basierend auf dem aktuellen Timecode angezeigt wird (der für FFmpeg-Filter verfügbar ist ). Dies erfordert zwar eine Änderung des Quellcodes des Filters und eine erneute Kompilierung von Grund auf, es würde jedoch auch die Verwendung eines separaten Programms / Daemons vermieden, das parallel ausgeführt wird (da Ihr eigener Code immer dann aufgerufen wird, wenn FFmpeg versucht, einen String zu zeichnen).

Vorausgesetzt, der textfileParameter funktioniert (gelesen: wird jeden Frame aktualisiert), wäre dies wahrscheinlich eine bessere Methode, da ein einfacher Daemon zum Aktualisieren der Textdatei in einer Skriptsprache wie Python geschrieben werden könnte.

Vielen Dank. Ich habe die Option ausprobiert ... aber sie verhält sich fast wie eine Textoption. Und die Datei scheint auf einmal gelesen zu werden (siehe load_textfile () oder Zeile 401). Wenn ich keine besseren Antworten bekomme, versuche ich, ffmpeg zu ändern und zu sehen, ob es funktioniert. user763410 vor 10 Jahren 0