Cómo configurar el formato de tiempo de pts cuando se usa el filtro ffmpeg para agregar una marca de tiempo

Quiero agregar una marca de tiempo del tiempo de reproducción actual a un video, así que uso esto:

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

Esto resulta que la marca de tiempo estaba en formato hh:mm:ss:mm, pero yo la quiero en formato hh:mm:ss. Entonces, ¿cómo puedo lograr este objetivo?

Respuestas (2)

Utilizar

text='timestamp \: %{pts\:gmtime\:0\:%H\\\:%M\\\:%S}'
Salió mal: [Parsed_drawtext_0 @ 0x7fe6e840fd40] Could not load font "%M\": cannot open resourcey[AVFilterGraph @ 0x7fe6e8708020] Error initializing filter 'drawtext' with args 'fontfile ***'
Estoy en Windows. Probablemente esté utilizando el shell bash. Puede intentar omitir las barras entre HM y S.
¡Si, tienes razón! En macOS use esto: text='timestamp \: %{pts\:gmtime\:0\:%H %M %S}'Parece que \:entre HM y S no está permitido. Entonces el ":" no se ha escapado. Me pregunto cómo escapar de ":". ¡Muchas gracias!
@WayneChen Fedora Linux fish que utilicé "...:text=%{pts\\\:hms}"como ejemplo para escapar de los parámetros. Ya tuve que escapar del carácter de comilla simple usando esto: set fileE (echo "$file" | sed 's|\'|\\\\\\\\\\\\\\\'|'), por lo que diría que siga agregando barras con cuidado hasta que funcione interpretado como un literal y no como un filtro o parámetro de función/separador de argumentos.

Hacer

Para dibujar Timestamp: 01:25., debe especificar este para (alimentar) ffmpeg:

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

No

Si especificas este para (feed) ffmpeg:

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

, da Unterminated %{} near '{pts:gmtime:0:%M\'error.

Pero enbash

Pero si está usando bash-como shell y una comilla débil "......", para alimentarlo,

  1. \\se escapa a \, y

  2. \:no se escapa pero permanece sin cambios porque \:no es una secuencia de escape.

Entonces debería ser:

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

es decir bash, 's "\\\\\:"por ffmpeg's para mostrar \\\:un solo carácter .:

Tenga en cuenta que

Si solo desea aplicar uno o más filtros a una transmisión de video (por ejemplo, drawtext), puede usar -vfen lugar de usar --filter_complex. Este último está reservado para aplicar filtros en múltiples flujos.