So stellen Sie das pts-Zeitformat ein, wenn Sie den ffmpeg-Filter verwenden, um einen Zeitstempel hinzuzufügen

Ich möchte einem Video einen Zeitstempel der aktuellen Wiedergabezeit hinzufügen, also verwende ich Folgendes:

ffmpeg -i video.mkv -filter_complex "drawtext=fontfile=/Library/Fonts/Arial.ttf: 
       text='timestamp: %{pts \: hms}': x=5: y=5: fontsize=16:
       fontcolor=yellow@0.9: box=1: boxcolor=blue@0.6" -c:a copy -c:v libx264 -map 0 output.mkv

Daraus ergibt sich, dass der Zeitstempel im Format hh:mm:ss:mm war, aber ich möchte ihn im Format hh:mm:ss. Wie kann ich dieses Ziel erreichen?

Antworten (2)

Verwenden

text='timestamp \: %{pts\:gmtime\:0\:%H\\\:%M\\\:%S}'
Es ging schief: [Parsed_drawtext_0 @ 0x7fe6e840fd40] Could not load font "%M\": cannot open resourceund[AVFilterGraph @ 0x7fe6e8708020] Error initializing filter 'drawtext' with args 'fontfile ***'
Ich bin auf Windows. Sie verwenden wahrscheinlich die Bash-Shell. Sie können versuchen, die Schrägstriche zwischen HM und S zu überspringen.
Ja, du hast recht! Verwenden Sie unter macOS Folgendes: text='timestamp \: %{pts\:gmtime\:0\:%H %M %S}', Es scheint, dass \:zwischen HM und S nicht zulässig ist. Das ":" ist also nicht entkommen. Ich frage mich, wie ich ":" entkommen kann. Danke vielmals!
@WayneChen Fedora Linux-Fisch, den ich "...:text=%{pts\\\:hms}"als Beispiel für das Maskieren von Parametern verwendet habe. Ich musste bereits einfache Anführungszeichen mit diesem Escapezeichen versehen: set fileE (echo "$file" | sed 's|\'|\\\\\\\\\\\\\\\'|'), also würde ich sagen, fügen Sie Schrägstriche sorgfältig hinzu, bis es funktioniert, interpretiert als Literal und nicht als Filter- oder Funktionsparameter/Argument-Trennzeichen.

Tun

Um zu zeichnen Timestamp: 01:25., sollten Sie diese bei (feed) angeben ffmpeg:

drawtext = text = 'Timestamp\: %{pts\:gmtime\:0\:%M\\\:%S}.'

Nicht

Wenn Sie diesen auf (feed) angeben ffmpeg:

drawtext = text = '%{pts\:gmtime\:0\:%M\\:%S}'

, es gibt Unterminated %{} near '{pts:gmtime:0:%M\'Fehler.

Aber inbash

Aber wenn Sie eine bash-ähnliche Shell und ein schwaches Anführungszeichen verwenden, "......"um es zu füttern,

  1. \\\wird nach , und entkommen

  2. \:wird nicht maskiert, bleibt aber unverändert, da \:es sich nicht um eine Escape-Sequenz handelt.

So sollte es sein:

-filter_complex "drawtext = text = '%{pts\:gmtime\:0\:%M\\\\\:%S}'"

dh bash's "\\\\\:"for ffmpeg's \\\:um ein einzelnes Zeichen :angezeigt zu bekommen.

Beachten Sie, dass

Wenn Sie nur einen oder mehrere Filter auf einen Videostream anwenden möchten (z. B. drawtext), können Sie -vfanstelle von verwenden --filter_complex. Letzteres ist für die Anwendung von Filtern auf mehrere Streams reserviert.