📜  ffmpeg 截图 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:30:45.297000             🧑  作者: Mango

FFMPEG 截图 - Shell/Bash

在多媒体处理中,一种常见的需求是从视频中提取静态图片。在命令行环境下,常用的工具是 ffmpeg,它能够对视频进行编解码、剪切、拼接等操作,并且支持从视频中截取图片。

基本用法

使用 ffmpeg 进行截图的命令格式如下:

ffmpeg -i <input_file> -ss <time_stamp> -vframes 1 <output_file>

其中,<input_file> 表示输入的视频文件路径,可以是本地文件或者网络文件 URL;<time_stamp> 表示截图的时间点,格式为 HH:MM:SS 或者以秒为单位的浮点数;<output_file> 表示截图的输出文件路径,通常以 .png.jpg 等图片格式结尾。

以下是一个简单的例子,从视频的第 10 秒处截取一张图片:

ffmpeg -i video.mp4 -ss 10 -vframes 1 image.png
更多选项

除了基本的用法外,ffmpeg 还支持许多选项,以满足更复杂的需求。以下是一些常用的选项:

  • -q:v <quality>:设置输出图片的质量,取值范围为 1-31,值越大质量越低,默认为 2。
  • -vf <filtergraph>:设置视频滤镜,可以对截图进行裁剪、缩放、旋转等操作。详见 官方文档
  • -frames:v <frames>:设置截取的图片数量,在一段时间内连续截取多张图片。

以下是一个例子,从一个分辨率为 1920x1080 的视频中,截取一张 640x360 像素的图片,质量设为 5:

ffmpeg -i video.mp4 -ss 10 -vf "scale=640:360" -q:v 5 -vframes 1 image.png
批量截图

如果需要对一个视频进行批量截图,可以通过 Shell 脚本来实现。以下是一个简单的例子:

#!/bin/bash

start_time=10
interval=5

while read line; do
  filename=$(basename "$line" | cut -d '.' -f 1)
  ffmpeg -y -i "$line" -ss "$start_time" -vframes 1 "$filename.png"
  start_time=$(echo "$start_time + $interval" | bc)
done <videolist.txt

以上脚本读取一个名为 videolist.txt 的文件,其中每行为一个视频文件的路径,从每个视频文件的第 10 秒开始,每隔 5 秒截取一张图片,并以视频文件名命名输出文件。-y 选项表示覆盖已存在的文件。

总结

ffmpeg 是一款非常强大的视频处理工具,它支持多种视频格式和编解码方式,并且提供了丰富的选项和滤镜,适合各种场景下的使用。在进行视频截图时,我们可以灵活运用其选项和 Shell 脚本来实现高效的批处理。