如何制作视频的缩略图
1. 概述
有时能提供一个视频的内容缩略图对用户来说会很方便,即使不播放也能快速查看下内容。在本文中会介绍两种方法来产生缩略图。第一种需要安装FFmpeg 和 ImageMagic 工具, 第二种需要安装Video Contact Sheet 工具。
2. 制作缩略图
2.1 使用可变帧来提取各帧图片
FFmpeg 是一个强大的操作视频和多媒体文件的命令行工具。它提供了像视频转换,提取,编辑等功能。
打开终端执行ffmpeg 命令。
ffmpeg -i house.mp4 -vf "select='eq(mod(n,15),0),scale=-1:120'" -vsync vfr output_%03d.png
说明:
- -i指定了要处理的输入视频
- house.mp4是 视频文件
- -vf 指定了视频过滤器
- select='eq(mod(n,15),0)' 指定了选择帧的过滤器, 其中选择了帧数n是15的倍数的那些帧
- scale=-1:120 把纵向设为120像素,横向保持原来纵横比
- -vsync vfr 设置视频同步方式为可变帧率来确保输出帧保持原始的时间戳
- output_%03d.png 是提取帧的文件名格式,%03d 是3位顺序号的占位符
FFmpeg 使用固定帧率(CFR, constant frame rate) 的同步方法。它认为输入视频具有固定的帧率。然而事实并非总是如此,有些时视频有或多或少变动的帧率。
2.2 使用固定帧来提取各帧图片
ffmpeg -i house.mp4 -r 1/15 -vf scale=-1:120 -vcodec png capture-%002d.png
- -r 设置输出的帧率
- 1/15 会每15s 抽取一张图片
- -vcodec png 会把每帧保存为 png图片
2.1 中的命令会比本条效率更高,因此大视频文件时,使用上条命令会更合适。
2.3 为图片添加时间戳
FFmpeg 默认不会为图片添加时间戳。如果需要,可以指定一个过滤器来画时间戳。
ffmpeg -i house.mp4 -r 1/15 -vf "drawtext=fontfile=/System/Library/Fonts/Monaco.ttf:timecode='00\\:00\\:00\\:00':r=30:fontcolor=white:fontsize=72:x=20:y=20:box=1:boxcolor=black@0.5, scale=-1:120" -vcodec png capture-%002d.png
- drawtext 允许我们添加一些自定义格式的文字叠加
- fontfile 指定了文字使用的字体文件
- timecode 设置了起始时间
- fontcolor 设置字体颜色
- fontsize 设置了字体像素
- x 和y 指定了文字位于坐标系的(20,20)处
- box, boxcolor 以及black 设置了时间戳文字的透明背景
效果如下:
2.4 使用ImageMagic 产生图库
ImageMagic 是操作图片的软件套件。它提供了例如放缩,裁剪,转换格式,添加效果,制作图片组合等广泛的特性。
我们可以使用montage 工具把前面的png 图片串起来。
montage -title "WuYue Bay" -tile x4 -geometry +10+10 *.png gallery.png
- montage 是用来做图片组和图片库的工具
- -tile x4 表明图片格的列是4列
- -geometry +10+10 指明水平和垂直方向图片间的间隔为10像素
- *.png 是输入图片集合
- gallery.png 是最终输出文件的名称
效果如下:
2.5 组装在一块
以上的命令可以组装为 shell 脚本, 命名为thumbs_gen.sh
#!/bin/bash
if ! command -v ffmpeg &> /dev/null || ! command -v montage &> /dev/null; then
echo "This script requires FFmpeg and ImageMagick"
exit 1
fi
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: $0 <video_file> <gallery_title>"
exit 1
fi
video_file="$1"
gallery_title="$2"
temp_dir=$(mktemp -d)
font_file="/System/Library/Fonts/Monaco.ttf"
ffmpeg -i "$video_file" -r 1/15 -vf "drawtext=fontfile=$font_file:timecode='00\\:00\\:00\\:00':r=30:fontcolor=white:fontsize=72:x=20:y=20:box=1:boxcolor=black@0.5, scale=-1:120" -vcodec png "$temp_dir/capture-%002d.png" || exit 1
montage -title "$gallery_title" -tile x4 -geometry +10+10 "$temp_dir"/*.png "${video_file}.png" || exit 1
rm -rf "$temp_dir"
现在使用一行命令就能产生视频的缩略图了
./thumbs_gen.sh house.mp4 wahaha
3. 替代方案:Video Contact Sheet
Video Contact Sheet(VCS) 是产生视频的缩略图库的shell 工具脚本。它只依赖FFmpeg。 可以在它的官网上安装。
安装后,我们可以使用不同的选项来制作缩略图库。
vcs house.mp4 -U0 -i 15s -c 3 -H 200 -a 300/200 -o gallery.jpg
- vcs 是工具,后面跟着输入文件
- -U0 指定图片的底部没有文字
- -i 15s 指定了采样间隔是15s
- -c 3 指定了图库的列数为3
- -H 200 设置图片的高度为200像素
- -a 300/200 设置横纵比为300/200
- -o 指定了输出文件名称
以下是通过vcs 制作的缩略图
翻译自:https://www.baeldung.com/linux/generate-video-thumbnails-gallery