如何批量遍历多文件夹合并音频为单文件并转Opus格式
我来帮你搞定这个批量处理广播剧的需求!结合你的要求,我会提供几个实用的Shell函数,完美适配find或者管道调用,既能处理单轨文件转码,也能自动合并多轨文件并统一输出为Opus格式(非常适合移动设备传输)。
前置准备
首先确保你安装了ffmpeg——这是处理音频转码、合并的核心工具:
- Ubuntu/Debian:
sudo apt install ffmpeg - macOS(需先装Homebrew):
brew install ffmpeg - Windows:可以用Chocolatey安装
choco install ffmpeg,或者从官网下载手动配置环境变量
函数1:单文件转Opus(处理已单轨的音频)
这个函数可以把单个音频文件(MP3/FLAC/WAV等)转成Opus格式,输出文件和原文件同目录,后缀替换为.opus。
convert_to_opus() { # 检查输入文件是否存在 if [ ! -f "$1" ]; then echo "❌ 错误:文件 $1 不存在" return 1 fi # 跳过已存在的Opus文件 local output_file="${1%.*}.opus" if [ -f "$output_file" ]; then echo "✅ 已存在:$output_file" return 0 fi # 转码为Opus,这里用128kbps比特率(语音类内容足够,可按需调整) ffmpeg -i "$1" -c:a libopus -vbr on -b:a 128k -v quiet -stats "$output_file" echo "✅ 转码完成:$output_file" }
使用方式:
- 配合
ls管道处理当前目录的MP3:ls *.mp3 | xargs -I {} convert_to_opus {} - 用
find遍历所有子目录的音频文件(排除已转好的Opus):find . -type f \( -name "*.mp3" -o -name "*.flac" -o -name "*.wav" \) ! -name "*.opus" -exec convert_to_opus {} \;
函数2:合并文件夹内所有音频为单个Opus(处理多轨文件)
这个函数会自动遍历指定文件夹内的所有音频文件,按文件名排序后合并成一个Opus文件,输出文件名和文件夹同名,放在该文件夹内。
merge_dir_to_opus() { local target_dir="$1" # 检查文件夹是否存在 if [ ! -d "$target_dir" ]; then echo "❌ 错误:文件夹 $target_dir 不存在" return 1 fi # 生成输出文件名 local dir_name=$(basename "$target_dir") local output_file="$target_dir/$dir_name.opus" # 跳过已存在的合并文件 if [ -f "$output_file" ]; then echo "✅ 已存在:$output_file" return 0 fi # 临时生成音频文件列表(按文件名排序,确保播放顺序正确) local temp_list=$(mktemp) find "$target_dir" -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.flac" -o -name "*.wav" -o -name "*.m4a" \) | sort > "$temp_list" # 检查是否有音频文件 if [ ! -s "$temp_list" ]; then echo "⚠️ 警告:文件夹 $target_dir 中未找到音频文件" rm "$temp_list" return 0 fi # 合并并转码为Opus ffmpeg -f concat -safe 0 -i "$temp_list" -c:a libopus -vbr on -b:a 128k -v quiet -stats "$output_file" # 清理临时文件 rm "$temp_list" echo "✅ 合并转码完成:$output_file" }
可选优化:按文件修改时间排序
如果你的多轨文件文件名没有按顺序命名,可以把生成列表的命令改成按修改时间排序(确保先录制的文件先合并):
find "$target_dir" -maxdepth 1 -type f \( -name "*.mp3" -o -name "*.flac" \) -printf "%T@ %p\n" | sort -n | cut -d' ' -f2- > "$temp_list"
使用方式:
- 处理当前目录下的所有一级子文件夹:
ls -d */ | xargs -I {} merge_dir_to_opus {} - 用
find遍历所有深度的子文件夹:find . -type d -exec merge_dir_to_opus {} \;
额外小贴士
- 比特率调整:广播剧以语音为主,64k-128kbps的Opus已经足够清晰,如果你追求更小体积,可以把
-b:a 128k改成-b:a 96k甚至64k;如果要保留更好音质,也可以设为192k。 - 保留原文件:以上函数都不会删除原文件,转码/合并完成后你可以手动清理原文件,或者在函数末尾添加
rm "$1"(单文件转码)或rm "$target_dir"/*.mp3(合并后删除原多轨文件)——注意:此操作不可逆,请谨慎使用。 - 持久化函数:如果想每次打开终端都能直接用这些函数,可以把函数代码复制到你的
~/.bashrc(Bash)或~/.zshrc(Zsh)文件末尾,然后执行source ~/.bashrc或source ~/.zshrc生效。
内容的提问来源于stack exchange,提问作者PiHalbe
相关产品推荐
相关产品推荐

