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?
Verwenden
text='timestamp \: %{pts\:gmtime\:0\:%H\\\:%M\\\:%S}'
Um zu zeichnen Timestamp: 01:25.
, sollten Sie diese bei (feed) angeben ffmpeg
:
drawtext = text = 'Timestamp\: %{pts\:gmtime\:0\:%M\\\:%S}.'
Wenn Sie diesen auf (feed) angeben ffmpeg
:
drawtext = text = '%{pts\:gmtime\:0\:%M\\:%S}'
, es gibt Unterminated %{} near '{pts:gmtime:0:%M\'
Fehler.
bash
Aber wenn Sie eine bash
-ähnliche Shell und ein schwaches Anführungszeichen verwenden, "......"
um es zu füttern,
\\
\
wird nach , und entkommen
\:
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.
Wenn Sie nur einen oder mehrere Filter auf einen Videostream anwenden möchten (z. B. drawtext
), können Sie -vf
anstelle von verwenden --filter_complex
. Letzteres ist für die Anwendung von Filtern auf mehrere Streams reserviert.
Wayne Chen
[Parsed_drawtext_0 @ 0x7fe6e840fd40] Could not load font "%M\": cannot open resource
und[AVFilterGraph @ 0x7fe6e8708020] Error initializing filter 'drawtext' with args 'fontfile ***'
Gyan
Wayne Chen
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!Pysis
"...: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.