如何制作视频的缩略图

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

posted @ 2023-07-19 10:54  宇德高辉  阅读(1254)  评论(0编辑  收藏  举报