ffmpeg 批量压缩 mp4 视频文件
2025-01-22 08:19:30    688 字   
This post is also available in English and alternative languages.

本篇内容探讨一个用于压缩 MP4 视频的 Shell 脚本。


1. 脚本

此脚本从输入目录读取所有 mp4 文件,使用 H.265 编码进行压缩,并将压缩后的文件保存到输出目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash

if [ $# -ne 2 ]; then
echo "Usage: $0 input_dir output_dir"
echo "This script compresses all mp4 videos in the input directory using ffmpeg and saves them to the output directory."
exit 1
fi

# 将输入参数赋值给变量
input_dir="$1"
output_dir="$2"

# 检查输入目录是否存在且不为空
if [ ! -d "$input_dir" ] || [ -z "$(ls -A "$input_dir")" ]; then
echo "Input directory does not exist or is empty."
exit 1
fi

# 检查输出目录是否存在,如果不存在则创建
if [ ! -d "$output_dir" ]; then
mkdir -p "$output_dir"
fi

# 初始化一个数组来保存视频文件列表
video_files=()

# 使用 find 命令获取输入目录中的所有 mp4 文件,并存储在 video_files 数组中
while IFS= read -r -d $'\0'; do
video_files+=("$REPLY")
done < <(find "$input_dir" -type f -name "*.mp4" -print0)

# 遍历数组中的每个视频文件
for file in "${video_files[@]}"; do
# 提取文件名和扩展名
filename=$(basename "$file")
extension="${filename##*.}"
# 使用 ffmpeg 压缩视频并保存到输出目录
ffmpeg -i "$file" -c:v libx265 -x265-params crf=15:preset=veryslow "$output_dir/${filename%.*}(1).mp4"
done

echo "Conversion complete."

2. ffmpeg 参数解释

ffmpeg -i “file"c:vlibx265x265paramscrf=15:preset=veryslow"file" -c:v libx265 -x265-params crf=15:preset=veryslow "output_dir/${filename%.*}(1).mp4”

  • -i "$file":指定输入文件。ffmpeg$file 变量提供的路径读取输入视频。

  • -c:v libx265:设置视频编解码器为 H.265(也称为 HEVC)。H.265 是一种高效视频编解码器,与 H.264 相比,在保持相同质量的情况下提供更好的压缩。

  • -x265-params crf=15:preset=veryslow:该参数控制压缩的质量和速度:

    • crf=15:恒定码率因子(CRF)值。它控制输出视频的质量。CRF 值范围从 0 到 51,其中 0 为无损,23 为默认值,51 为最差质量。较低的 CRF 值意味着较高的质量。在此脚本中,crf=15 提供高质量输出。
    • preset=veryslow:控制压缩速度。预设值范围从 ultrafastplaceboveryslow 提供更好的压缩效果,但处理时间更长。使用 veryslow 意味着脚本将花费更多时间压缩视频,但文件大小会更小,质量更高。
  • "$output_dir/${filename%.\*}(1).mp4":指定输出文件路径和名称。表达式 ${filename%.*} 移除原始文件名的扩展名,并附加 (1) 以避免覆盖原文件。新文件以 .mp4 扩展名保存在指定的输出目录中。