Вопрос Как я могу наложить захваченную метку времени на видео, используя ffmpeg в формате ГГГГ-ММ-ДД ЧЧ: ММ: СС?


Я пытаюсь наложить временную метку (дату и время захвата кадра) на видеокадры для сохраненного видеофайла с помощью ffmpeg.

Это позволяет отображать время в секундах с начала видео:

ffmpeg -i in.webm -filter_complex "drawtext=fontfile=/usr/share/fonts/truetype/arial.ttf: text='%{pts \:flt}': x=100 : y=50 : box=1" -c:a copy out.webm

документация указывает, что pts может также gmtime аргумент для печати даты и времени,

PTS

Временная метка текущего кадра. Это может принимать до трех аргументов.

Первый аргумент - это формат метки времени; он по умолчанию имеет значение flt в секундах как десятичное число с точностью до микросекунды; hms обозначает отформатированную временную метку [-] HH: MM: SS.mmm с точностью до миллисекунды. gmtime обозначает временную метку кадра, отформатированного как время UTC; localtime обозначает отметку времени кадра, отформатированного как время локального часового пояса.

Второй аргумент - это смещение, добавленное к метке времени.

Если формат установлен на localtime или gmtime, может быть предоставлен третий аргумент: строка формата strftime (). По умолчанию используется формат ГГГГ-ММ-ДД ЧЧ: ММ: СС.

Но когда я пытаюсь использовать ffmpeg -i in.webm -filter_complex "drawtext=fontfile=/usr/share/fonts/truetype/arial.ttf: text='%{pts \:gmtime}': x=100 : y=50 : box=1" -c:a copy out.webm Я получаю ошибку Invalid format 'gmtime',

ffmpeg version 2.8.3 Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 4.8 (SUSE Linux)
  configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --incdir=/usr/include/ffmpeg --extra-cflags='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g' --optflags='-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g' --disable-htmlpages --enable-pic --disable-stripping --enable-shared --disable-static --enable-runtime-cpudetect --enable-gpl --disable-openssl --enable-avresample --enable-libcdio --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libcelt --enable-libcdio --enable-libdc1394 --enable-libfreetype --enable-libgsm --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-pic --enable-pthreads --enable-vaapi --enable-vdpau --disable-decoder=dca --enable-libdcadec --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtwolame --enable-libvo-aacenc --enable-libx264 --enable-libx265 --enable-libxvid --enable-version3 --enable-x11grab
  libavutil      54. 31.100 / 54. 31.100
  libavcodec     56. 60.100 / 56. 60.100
  libavformat    56. 40.101 / 56. 40.101
  libavdevice    56.  4.100 / 56.  4.100
  libavfilter     5. 40.101 /  5. 40.101
  libavresample   2.  1.  0 /  2.  1.  0
  libswscale      3.  1.101 /  3.  1.101
  libswresample   1.  2.101 /  1.  2.101
  libpostproc    53.  3.100 / 53.  3.100
Input #0, matroska,webm, from 'in.webm':
  Metadata:
    encoder         : Lavf56.40.101
  Duration: 00:01:43.32, start: 0.007000, bitrate: 504 kb/s
    Stream #0:0(eng): Video: vp8, yuv420p, 480x640, SAR 1:1 DAR 3:4, 1k fps, 1k tbr, 1k tbn, 1k tbc (default)
    Metadata:
      title           : Video
    Stream #0:1: Audio: opus, 48000 Hz, stereo, fltp (default)
[libvpx-vp9 @ 0x2083580] v1.3.0
[webm @ 0x20823a0] Codec for stream 1 does not use global headers but container format requires global headers
Output #0, webm, to 'out.webm':
  Metadata:
    encoder         : Lavf56.40.101
    Stream #0:0: Video: vp9 (libvpx-vp9), yuv420p, 480x640 [SAR 1:1 DAR 3:4], q=-1--1, 200 kb/s, 1k fps, 1k tbn, 1k tbc (default)
    Metadata:
      encoder         : Lavc56.60.100 libvpx-vp9
    Stream #0:1: Audio: opus, 48000 Hz, stereo (default)
Stream mapping:
  Stream #0:0 (vp8) -> drawtext
  drawtext -> Stream #0:0 (libvpx-vp9)
  Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[Parsed_drawtext_0 @ 0x2084ea0] Invalid format 'gmtime'
    Last message repeated 1 times
Past duration 0.999992 too large
[Parsed_drawtext_0 @ 0x2084ea0] Invalid format 'gmtime'
    Last message repeated 28 times

Как получить наложенный текст для отображения времени UTC в формате YHYY-MM-DD HH: MM: SS?


3
2017-12-15 17:31


происхождения


Он используется следующим образом: text='%{gmtime}', но будет отображаться текущее время, отформатированное как UTC. Я не уверен, что это то, что вы хотите или нет. - LordNeckbeard
@LordNeckbeard Нет, к сожалению, это не то, что я ищу, я ищу время, когда был захвачен фрейм. Я включил раздел документации, в котором описывается то, что я надеялся сделать. - mattm


ответы:


«gmtime», похоже, работает сейчас.

Я использую эту строку:

"drawtext=fontfile=FreeSerif.ttf:fontcolor=white:text='%{pts\\:gmtime}:fontsize=14'[out]"

Я использую его из кода c ++, поэтому вам может понадобиться избежать его по-другому.

В качестве альтернативы вы можете использовать комбинацию статического текста для даты и 'HMS' с параметром offset для восстановления времени в любом часовом поясе, в котором вы нуждаетесь:

"drawtext=fontfile=FreeSerif.ttf:fontcolor=white:text='1970-01-01 %{pts\\:HMS\\:7200}:fontsize=14'[out]"

0
2018-06-29 07:59





Вы можете использовать время запуска как целое число Unix Epoch (1507046400 ниже) и в качестве альтернативы сообщать формат даты (% d-% m-% Y% T ниже):

text='%{pts\:gmtime\:1507046400\:%d-%m-%Y %T}'

0
2017-10-04 14:25



Информирование о времени начала работы полезно, когда вы отмечаете видео, которое было записано в (или содержит изображения из) прошлого. - Denio Mariz