直接上代码。
【注意】转换成功后会删除原文件,如不希望删除请务必修改代码,否则后果自负!
bash
#!/bin/bash
# 递归遍历所有 .mp4 文件
find . -type f -name "*.mp4" | while read -r mp4_file; do
echo "检查文件: $mp4_file"
# 检查音轨编码格式
audio_codec=$(ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$mp4_file" 2>/dev/null)
if [ "$audio_codec" = "flac" ]; then
echo " -> 发现 FLAC 音轨"
output_file="${mp4_file%.mp4}.flac"
# 提取音轨
if ffmpeg -i "$mp4_file" -vn -acodec copy "$output_file" -y 2>&1 | grep -q "error\|Error"; then
echo " -> 转换失败,保留原文件"
else
if [ -f "$output_file" ]; then
echo " -> 转换成功: $output_file"
rm "$mp4_file"
echo " -> 已删除原文件: $mp4_file"
else
echo " -> 转换失败(输出文件不存在),保留原文件"
fi
fi
elif [ "$audio_codec" = "aac" ]; then
echo " -> 发现 AAC 音轨"
output_file="${mp4_file%.mp4}.m4a"
# 提取音轨
if ffmpeg -i "$mp4_file" -vn -acodec copy "$output_file" -y 2>&1 | grep -q "error\|Error"; then
echo " -> 转换失败,保留原文件"
else
if [ -f "$output_file" ]; then
echo " -> 转换成功: $output_file"
rm "$mp4_file"
echo " -> 已删除原文件: $mp4_file"
else
echo " -> 转换失败(输出文件不存在),保留原文件"
fi
fi
else
echo " -> 音轨编码为: $audio_codec (跳过)"
fi
echo ""
done
echo "处理完成!"