You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量遍历多文件夹合并音频为单文件并转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 {} \;
    

额外小贴士

  1. 比特率调整:广播剧以语音为主,64k-128kbps的Opus已经足够清晰,如果你追求更小体积,可以把-b:a 128k改成-b:a 96k甚至64k;如果要保留更好音质,也可以设为192k。
  2. 保留原文件:以上函数都不会删除原文件,转码/合并完成后你可以手动清理原文件,或者在函数末尾添加rm "$1"(单文件转码)或rm "$target_dir"/*.mp3(合并后删除原多轨文件)——注意:此操作不可逆,请谨慎使用。
  3. 持久化函数:如果想每次打开终端都能直接用这些函数,可以把函数代码复制到你的~/.bashrc(Bash)或~/.zshrc(Zsh)文件末尾,然后执行source ~/.bashrc或source ~/.zshrc生效。

内容的提问来源于stack exchange,提问作者PiHalbe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:27:22