【问题标题】:ffmpeg failing to expand drawtextffmpeg无法扩展drawtext
【发布时间】:2025-11-25 06:10:01
【问题描述】:

我正在尝试在我的视频上添加 seconds:milliseconds 时间戳,但我已经为此烦恼了几个小时,但没有任何结果。如果我写:

ffmpeg -f lavfi -i testsrc=duration=5:size=800x600:rate=30 -vf drawtext="fontfile=C\\:/Windows/Fonts/arial.ttf:text='%{pts}': x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1" -preset ultrafast output.mp4

%{pts} 不会被展开,而只会在框架上显示文字文本 {pts}

请注意,我已经阅读了大量有关此时间戳叠加内容的网络指南(ffmpeg 文档/指南/wiki、*、博客等),但没有一个解决方案/语法起作用:它只是覆盖了文字。

一些上下文:

完整的输出日志:

[E:\]ffmpeg -f lavfi -i testsrc=duration=5:size=800x600:rate=30 -vf drawtext="fontfile=C\\:/Windows/Fonts/arial.ttf:text=%{pts}: x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1" -preset ultrafast output.mp4
ffmpeg version N-76822-g12a419d Copyright (c) 2000-2015 the FFmpeg developers
  built with gcc 5.2.0 (GCC)
  configuration: --enable-gpl --enable-version3 --disable-w32threads --enable-avisynth --enable-bzlib --enable-fontconfig --enable-frei0r --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libdcadec --enable-libfreetype --enable-libgme --enable-libgsm --enable-libilbc --enable-libmodplug --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvo-aacenc --enable-libvo-amrwbenc --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxavs --enable-libxvid --enable-libzimg --enable-lzma --enable-decklink --enable-zlib
  libavutil      55.  9.100 / 55.  9.100
  libavcodec     57. 16.100 / 57. 16.100
  libavformat    57. 19.100 / 57. 19.100
  libavdevice    57.  0.100 / 57.  0.100
  libavfilter     6. 15.100 /  6. 15.100
  libswscale      4.  0.100 /  4.  0.100
  libswresample   2.  0.101 /  2.  0.101
  libpostproc    54.  0.100 / 54.  0.100
Input #0, lavfi, from 'testsrc=duration=5:size=800x600:rate=30':
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: rawvideo (RGB[24] / 0x18424752), rgb24, 800x600 [SAR 1:1 DAR 4:3], 30 tbr, 30 tbn, 30 tbc
File 'output.mp4' already exists. Overwrite ? [y/N] y
No pixel format specified, yuv444p for H.264 encoding chosen.
Use -pix_fmt yuv420p for compatibility with outdated media players.
[libx264 @ 00000000003f83c0] using SAR=1/1
[libx264 @ 00000000003f83c0] using cpu capabilities: MMX2 SSE2Fast SSSE3 Cache64 SlowShuffle
[libx264 @ 00000000003f83c0] profile High 4:4:4 Predictive, level 3.1, 4:4:4 8-bit
[libx264 @ 00000000003f83c0] 264 - core 148 r2638 7599210 - H.264/MPEG-4 AVC codec - Copyleft 2003-2015 - http://www.videolan.org/x264.html - options: cabac=0 ref=1 deblock=0:0:0 analyse=0:0 me=dia subme=0 psy=1 psy_rd=1.00:0.00 mixed_ref=0 me_range=16 chroma_me=1 trellis=0 8x8dct=0 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=6 threads=3 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0 keyint=250 keyint_min=25 scenecut=0 intra_refresh=0 rc=crf mbtree=0 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=0
Output #0, mp4, to 'output.mp4':
  Metadata:
    encoder         : Lavf57.19.100
    Stream #0:0: Video: h264 (libx264) ([33][0][0][0] / 0x0021), yuv444p, 800x600 [SAR 1:1 DAR 4:3], q=-1--1, 30 fps, 15360 tbn, 30 tbc
    Metadata:
      encoder         : Lavc57.16.100 libx264
Stream mapping:
  Stream #0:0 -> #0:0 (rawvideo (native) -> h264 (libx264))
Press [q] to stop, [?] for help
frame=  150 fps= 61 q=-1.0 Lsize=     185kB time=00:00:05.00 bitrate= 303.2kbits/s
video:184kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.755086%
[libx264 @ 00000000003f83c0] frame I:1     Avg QP:20.00  size: 18409
[libx264 @ 00000000003f83c0] frame P:149   Avg QP:16.11  size:  1135
[libx264 @ 00000000003f83c0] mb I  I16..4: 100.0%  0.0%  0.0%
[libx264 @ 00000000003f83c0] mb P  I16..4:  0.7%  0.0%  0.0%  P16..4:  5.1%  0.0%  0.0%  0.0%  0.0%    skip:94.2%
[libx264 @ 00000000003f83c0] coded y,u,v intra: 5.0% 3.3% 2.8% inter: 1.1% 1.0% 0.9%
[libx264 @ 00000000003f83c0] i16 v,h,dc,p: 81%  6%  2% 11%
[libx264 @ 00000000003f83c0] kb/s:299.93

[E:\]

【问题讨论】:

  • 更新的问题:更正了 pts 中的 ptr 并删除了 %{pts} 周围的引号(感谢 @aergistal),但仍然不起作用
  • 当答案无效时,您不应该更改您的问题。
  • 抱歉,我这样做是为了更好地关注这个问题。对不起,这是我的第一个问题......
  • 回滚引号。

标签: video command-line ffmpeg timestamp drawtext


【解决方案1】:

删除%{pts} 周围的撇号(由 aergistal 提出),并将百分号用双引号括起来,像这样。

ffmpeg -f lavfi -i testsrc=duration=5:size=800x600:rate=30 -vf drawtext=
"fontfile=C\\:/Windows/Fonts/arial.ttf:text="%"{pts}:x=(w-tw)/2:y=h-(2*lh):
fontcolor=white:box=1:boxcolor=0x00000000@1" -preset ultrafast output.mp4

(我还删除了-vf参数中的空格,因为它们不是必需的。)

你看,Unix shell 和 Windows 命令行都会对命令进行一些更改,这就是为什么你需要像这样重复反斜杠:\\。这可能会变得复杂和令人困惑。每个平台都有点不同,因此如果不进行一些试验,很难为您提供可行的解决方案。目前,我无法通过有效的 ffmpeg 安装访问 Windows 命令行,因此无法测试此解决方案。但我知道百分号% 是特殊处理的。它似乎被你的命令行吃掉了,这就是为什么你会看到一个文字 {pts} 覆盖在框架上。

请参阅此 * 答案Is there a way to prevent percent expansion of env variable in Windows command line?

编辑:由于 OP 补充说他使用TCC/LE 作为外壳,我建议将百分号加倍,如下所示:

ffmpeg -f lavfi -i testsrc=duration=5:size=800x600:rate=30 -vf drawtext=
"fontfile=C\\:/Windows/Fonts/arial.ttf:text=%%{pts}:x=(w-tw)/2:y=h-(2*lh):
fontcolor=white:box=1:boxcolor=0x00000000@1" -preset ultrafast output.mp4

上面提到的 * 答案中也讨论了这个解决方案。

【讨论】:

  • 我测试过,在 *nix 中它会扩展而不管引号是什么
  • 感谢对棘手转义的观察:这让我质疑我使用TCC/LE 作为外壳的事实,而这正是罪魁祸首!切换到标准 cmd.exe 解决了这个问题。我应该如何在 stackexchange 上突出显示此解决方案?我应该自己发布一个提到你们的答案(你们俩都非常有帮助)吗?还是我应该把它留在评论中?
  • @aergistal,您的回答很好,它提供了部分解决方案。没有它,我无法发布自己的答案。
  • 供参考,命令的正确形式是ffmpeg -f lavfi -i testsrc=duration=5:size=800x600:rate=30 -vf drawtext="fontfile=C\\:/Windows/Fonts/arial.ttf:text=%{pts}:x=(w-tw)/2:y=h-(2*lh):fontcolor=white:box=1:boxcolor=0x00000000@1" -preset ultrafast output.mp4
  • 也许你可以通过加倍来逃避 TCC/LE 中的百分号。