使用FFmpeg从视频创建动画GIF和WebP - mattj


FFmpeg是一个免费的开源软件项目,由用于处理视频,音频和其他多媒体文件和流的大量库和程序组成。我们将使用它在格式之间进行转换,例如将视频转换为GIF或动画WebP。
FFmpeg的win10下载地址:https://github.com/BtbN/FFmpeg-Builds/releases
打开您的终端,然后运行以下命令:
ffmpeg -version
如果FFmpeg可用,您将注意到类似以下的输出:

FFmpeg version 4.3.1 Copyright   2000–2020 the FFmpeg developers
...

 
使用FFmpeg转换为动画GIF
ffmpeg -i $INPUT_FILENAME \
-vf "fps=$OUTPUT_FPS,scale=$OUTPUT_WIDTH:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
-loop $NUMBER_OF_LOOPS $OUTPUT_FILENAME

# * $INPUT_FILENAME - 输入视频的路径.
# * $OUTPUT_FPS - 每秒输出帧数。以“10”开头.
# * $OUTPUT_WIDTH - 以像素为单位的输出宽度。保持纵横比.
# * $NUMBER_OF_LOOPS - 使用“0”可以永远循环,也可以使用特定数量的循环。
# * $OUTPUT_FILENAME - 输出动画GIF的名称。

使用案例:
ffmpeg -i "sample_recording.mp4" \
-vf
"fps=10,scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
-loop 0 sample_recording.gif

 
将视频的一部分转换为GIF
ffmpeg -ss $INPUT_START_TIME -t $LENGTH -i $INPUT_FILENAME \
-vf "fps=$OUTPUT_FPS,scale=$OUTPUT_WIDTH:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
-loop $NUMBER_OF_LOOPS $OUTPUT_FILENAME

# * $INPUT_START_TIME - 输入视频中要开始的秒数.
# * $LENGTH - 从输入视频转换的秒数长度.
# * 其余同上

这是此命令的示例,其中输入选项已填写:
ffmpeg -ss 32.5 -t 7 -i "sample_recording.mp4" \
-vf
"fps=10,scale=720:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
-loop 0 sample_recording.gif

 
使用FFmpeg转换为动画WebP
这是基本命令,带有用于将整个视频转换为动画WebP的各种选项。您可以使用FPS,输出宽度和质量等选项来确定文件的大小和输出质量:
ffmpeg -i $INPUT_FILENAME \
-vf "fps=$OUTPUT_FPS,scale=$OUTPUT_WIDTH:-1:flags=lanczos" \
-vcodec libwebp -lossless 0 -compression_level 6 \
-q:v $OUTPUT_QUALITY -loop $NUMER_OF_LOOPS \
-preset picture -an -vsync 0 $OUTPUT_FILENAME

# * $OUTPUT_QUALITY - WebP输出的质量。以“50”开头。
# * $OUTPUT_FILENAME - 输出动画WebP的名称。
# *其余同上

这是此命令的示例,其中输入选项已填写:
ffmpeg -i "sample_recording.mp4" \
-vf
"fps=10,scale=720:-1:flags=lanczos" \
-vcodec libwebp -lossless 0 -compression_level 6 \
-q:v 50 -loop 0 \
-preset picture -an -vsync 0 sample_recording.webp

 
将视频的一部分转换为动画WebP
ffmpeg -ss $INPUT_START_TIME -t $LENGTH -i $INPUT_FILENAME \
-vf "fps=$OUTPUT_FPS,scale=$OUTPUT_WIDTH:-1:flags=lanczos" \
-vcodec libwebp -lossless 0 -compression_level 6 \
-q:v $OUTPUT_QUALITY -loop $NUMER_OF_LOOPS \
-preset picture -an -vsync 0 $OUTPUT_FILENAME

这是此命令的示例,其中输入选项已填写:
ffmpeg -ss 32.5 -t 7 -i "sample_recording.mp4" \
-vf
"fps=10,scale=720:-1:flags=lanczos" \
-vcodec libwebp -lossless 0 -compression_level 6 \
-q:v 50 -loop 0 \
-preset picture -an -vsync 0 sample_recording.webp

访问此处的GitHub Gist获取所有命令和示例的代码。