Как установить формат времени pts при использовании фильтра ffmpeg для добавления метки времени

Я хочу добавить временную метку текущего времени воспроизведения к видео, поэтому я использую это:

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

Получается, что метка времени была в формате чч: мм: сс: мм, но я хочу, чтобы она была в формате чч: мм: сс. Итак, как я могу достичь этой цели?

Ответы (2)

Использовать

text='timestamp \: %{pts\:gmtime\:0\:%H\\\:%M\\\:%S}'
Это пошло не так: [Parsed_drawtext_0 @ 0x7fe6e840fd40] Could not load font "%M\": cannot open resourceи[AVFilterGraph @ 0x7fe6e8708020] Error initializing filter 'drawtext' with args 'fontfile ***'
Я на Windows. Вероятно, вы используете оболочку bash. Вы можете попробовать пропустить косую черту между HM и S.
Да, ты прав! В macOS используйте это: text='timestamp \: %{pts\:gmtime\:0\:%H %M %S}'Кажется, что \:между HM и S не допускается. Таким образом, ":" не исчез. Мне интересно, как избежать ":". Большое спасибо!
@WayneChen Fedora Linux fish, которую я использовал "...:text=%{pts\\\:hms}"в качестве примера экранирования параметров. Мне уже приходилось экранировать символ одинарной кавычки, используя это: set fileE (echo "$file" | sed 's|\'|\\\\\\\\\\\\\\\'|'), поэтому я бы сказал, продолжайте осторожно добавлять косые черты, пока он не будет интерпретироваться как литерал, а не как фильтр или разделитель параметра/аргумента функции.

Делать

Чтобы нарисовать Timestamp: 01:25., вы должны указать это в (feed) ffmpeg:

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

Не

Если вы укажете это для (feed) ffmpeg:

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

, выдает Unterminated %{} near '{pts:gmtime:0:%M\'ошибку.

Но вbash

Но если вы используете bashоболочку -like и слабую кавычку "......", чтобы передать ее,

  1. \\сбежал в \, и

  2. \:не экранируется, но остается без каких-либо изменений, поскольку \:не является escape-последовательностью.

Так должно быть:

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

т.е. bashдля "\\\\\:"отображения одного ffmpegсимвола .\\\::

Обратите внимание, что

Если вы хотите применить только один или несколько фильтров к одному видеопотоку (например, drawtext), вы можете использовать -vfвместо использования --filter_complex. Последний зарезервирован для применения фильтров к нескольким потокам.