如何使用正确的时间码生成带有视频缩略图的图块

How to generate tile with video thumbnails with right timecode

我正在使用 FFMPEG 库使用以下命令每 5 秒生成一次带有时间码的视频缩略图:

 ffmpeg \
-i 20051210-w50s.flv \
-y \
-frames 1 \
-vf " \
    select=not(mod(t\,5)), \
    scale=320:-1, \
    drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf: \
    timecode='00\:00\:00\:00': r=25: fontcolor=white: x=220: y=220: box=1: boxcolor=black@0.5, \
    tile=5x2" \
-vsync 0 \
out.jpg

它会生成正确的缩略图图块,但时间码是错误的。如何解决这个问题?

drawtext 过滤器未引用时间戳。它使用一个简单的计数器来增加每个新帧的时间码。所以,这样做的方法是绘制每个时间码,然后丢帧。

ffmpeg \
-i 20051210-w50s.flv \
-y \
-frames 1 \
-vf " \        
    scale=320:-1, \
    drawtext=fontfile=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf: \
    timecode='00\:00\:00\:00': r=25: fontcolor=white: x=220: y=220: box=1: boxcolor=black@0.5, \
    select=not(mod(t\,5)), \
    tile=5x2" \
-vsync 0 \
out.jpg

在 select 使用有用的帧之前为每一帧绘制文本可以解决问题,但也会带来性能损失。我做了一个实验,结果证实了我的猜测。

更好的解决方案是先调用“select”并使用 text='%{pts:hms}' 代替时间码。

ffmpeg \
-i 20051210-w50s.flv \
-y \
-frames 1 \
-vf \
    "select=not(mod(t\,5)), \
    scale=320:-1, \
    drawtext=text='%{pts:hms}': fontfile=/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf: \
    fontcolor=white: x=220: y=220: box=1: boxcolor=black@0.5, \
    tile=5x2" \
-vsync 0 \
out.jpg