windowsvideoffmpegdrawtext

Displaying the current frame of a video after skipping using drawtext/start_number not evaluation any variables


I would like to display the current frame number on a video while playing it with ffplay. I have already seen this solution, but when I seek to any part of the video, the counter resets. There's a variable, start_number, which the ffplay documentation says is The starting frame number for the n/frame_num variable. The default value is "0". It seems that n is set to that when starting the video or seeking between I-frames. I thought setting this variable to %{floor(t*60)} would solve my problem, but after running this:

ffplay -i "video.mp4" -vf drawtext="fontsize=30:box=1:boxcolor=white:fontcolor=black:fontfile=/Windows/Fonts/arial.ttf:start_number=floor(t*60):text=%{n}"

I got the following console output:

ffplay version N-84679-gd65b595 Copyright (c) 2003-2017 the FFmpeg developers
  built with gcc 6.3.0 (GCC)
  configuration: --enable-gpl --enable-version3 --enable-cuda --enable-cuvid --enable-d3d11va --enable-dxva2 --enable-libmfx --enable-nvenc --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-zlib
  libavutil      55. 51.100 / 55. 51.100
  libavcodec     57. 86.103 / 57. 86.103
  libavformat    57. 67.100 / 57. 67.100
  libavdevice    57.  3.101 / 57.  3.101
  libavfilter     6. 78.100 /  6. 78.100
  libswscale      4.  3.101 /  4.  3.101
  libswresample   2.  4.100 /  2.  4.100
  libpostproc    54.  2.100 / 54.  2.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'video.mp4':=    0B f=0/0
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    creation_time   : 2017-03-30T02:49:20.000000Z
    encoder         : Open Broadcaster Software v0.659b
  Duration: 00:05:36.85, start: 0.000000, bitrate: 72636 kb/s
    Stream #0:0(eng): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 162 kb/s (default)
    Metadata:
  creation_time   : 2017-03-30T02:49:20.000000Z
  handler_name    : Sound Media Handler
Stream #0:1(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, bt709/bt709/iec61966-2-1), 2560x1440, 72465 kb/s, 60 fps, 60 tbr, 1k tbn, 120 tbc (default)
Metadata:
  creation_time   : 2017-03-30T02:49:20.000000Z
  handler_name    : Video Media Handler
  encoder         : AVC Coding
[drawtext @ 00000000122770e0] [Eval @ 0000000008f3eb60] Undefined constant or missing '(' in 't*60)'
[drawtext @ 00000000122770e0] Unable to parse option value "floor(t*60)"
[drawtext @ 00000000122770e0] [Eval @ 0000000008f3ebd0] Undefined constant or missing '(' in 't*60)'
[drawtext @ 00000000122770e0] Unable to parse option value "floor(t*60)"
[drawtext @ 00000000122770e0] Error setting option start_number to value floor(t*60).
[Parsed_drawtext_0 @ 000000000263eca0] Error applying options to the filter.
Error initializing filter 'drawtext' with args 'fontsize=30:box=1:boxcolor=white:fontcolor=black:fontfile=/Windows/Fonts/arial.ttf:start_number=floor(t*60):text=%{n}'
   0.01 A-V:    nan fd=   0 aq=   22KB vq= 5866KB sq=    0B f=0/0

In fact, any variable in start_number's assignment invokes this error. I don't know if I have the correct syntax, but does this mean it doesn't evaluate expressions? Or maybe it doesn't accept variables for some reason?

After that downer I tried just setting the text to %{t}, which played the video, but repeatedly gave this error and had no text in the top left corner:

[Parsed_drawtext_0 @ 0000000003e54ea0] %{t} is not known 0B f=0/0

So does the current time variable just not work in drawtext?
Is there another way to write the current frame on the video or even on the console window?

Using Windows 10 Enterprise and the latest build of ffplay for windows at this time.


Solution

  • Assuming the video has a constant frame rate of 60 fps, use

    ffplay -i "video.mp4"
     -vf "drawtext=fontsize=30:box=1:boxcolor=white:fontcolor=black:fontfile=/Windows/Fonts/arial.ttf:text='%{eif\:t*60\:d}'"