ffmpeg 批量将 mkv 视频转换 mp4 格式并压缩
2025-01-22 08:19:30    435 字   
This post is also available in English and alternative languages.

网上下载的不少影视资源都是 mkv 格式的,某些场景下通用性不如 mp4,而且文件体积也很大,可以进行一定的压缩以减小文件体积。


1. 安装 ffmpeg

1
brew install ffmpeg

2. 脚本

新建一个.sh扩展名的脚本,粘贴以下代码:

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
42
43
44
45
46
47
48
49
50
51
#!/bin/bash

function display_usage {
echo "Usage: $0 -i input_dir -o output_dir"
echo "Converts MKV video files to MP4 format with H.265 compression."
echo " -i Input directory containing MKV files to be converted."
echo " -o Output directory where converted MP4 files will be saved."
exit 1
}

# 检查入参
if [ $# -eq 0 ]; then
display_usage
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

# 使用find命令获取所有视频文件列表并保存到数组中
video_files=()
while IFS= read -r -d $'\0'; do
video_files+=("$REPLY")
done < <(find "$input_dir" -type f -iname "*.mkv" -print0)

# 用for循环遍历视频文件列表并处理视频转换
for file in "${video_files[@]}"; do
# 提取文件名和扩展名
filename=$(basename "$file")
output_file="$output_dir/${filename%.*}.mp4"

ffmpeg -i "$file" -c:v libx265 -x265-params crf=18 "$output_file"

if [ $? -eq 0 ]; then
echo "Converted: $output_file"
else
echo "Error converting: $file"
fi
done

echo "Conversion complete."

crf 是 Constant Rate Factor 的缩写,它的值越小,画质越高,占用的空间越大。
可选项为 0 ~ 51,默认为28。当 crf 在20以下的时候,能实现视觉上的无损。


3. 运行脚本

然后在命令行中执行以下代码即可:

1
bash /path/to/your/script.sh inputPath outputPath