在macOS上用FFmpeg批量分割音频的技术实现问询
完善FFmpeg批量音频分割Shell脚本(macOS/UNIX)
我来帮你搞定这个批量分割音频的需求,针对你给出的文本格式和macOS终端环境,下面是完整的可运行脚本,以及关键细节的解释:
完整的split.command脚本
#!/bin/bash # 配置你的输入参数 inputFileName="audiofile.mp3" # 记得加上音频文件的后缀,比如.mp3/.flac/.m4a等 inputList="test.txt" # 先检查必要文件是否存在,避免后续报错 if [[ ! -f "$inputFileName" ]]; then echo "❌ 错误:输入音频文件 $inputFileName 不存在,请检查路径!" exit 1 fi if [[ ! -f "$inputList" ]]; then echo "❌ 错误:时间列表文件 $inputList 不存在,请检查路径!" exit 1 fi # 逐行读取时间列表文件 while IFS= read -r line do # 跳过空行,避免处理无效内容 [[ -z "$line" ]] && continue # 用awk分割每行内容,分隔符是你文本里的「空格-空格」 # 同时去除每个字段前后的空格,保证时间和名称格式干净 startTime=$(echo "$line" | awk -F ' - ' '{gsub(/^[[:space:]]+|[[:space:]]+$/, "", $1); print $1}') endTime=$(echo "$line" | awk -F ' - ' '{gsub(/^[[:space:]]+|[[:space:]]+$/, "", $2); print $2}') artist=$(echo "$line" | awk -F ' - ' '{gsub(/^[[:space:]]+|[[:space:]]+$/, "", $3); print $3}') title=$(echo "$line" | awk -F ' - ' '{gsub(/^[[:space:]]+|[[:space:]]+$/, "", $4); print $4}') # 构造输出文件名:把空格换成下划线,避免文件名带空格导致FFmpeg报错 # 同时保留原音频的文件后缀 outputFileName="${artist// /_}-${title// /_}.${inputFileName##*.}" # 执行FFmpeg分割命令 echo "🔄 正在分割:$outputFileName" ffmpeg -hide_banner -loglevel error -i "$inputFileName" -ss "$startTime" -to "$endTime" -c copy "$outputFileName" # 检查分割是否成功,给出反馈 if [[ $? -eq 0 ]]; then echo "✅ $outputFileName 分割完成!" else echo "⚠️ $outputFileName 分割失败,请检查时间格式或FFmpeg安装情况!" fi done < "$inputList" echo "🎉 所有分割任务已完成!"
关键细节解释
- 脚本头部:
#!/bin/bash指定用bash执行,macOS默认shell是zsh,但bash完全兼容,这样写更通用。 - 文件检查:提前判断音频文件和列表文件是否存在,避免脚本执行到一半才报错。
- 行处理:
IFS= read -r line保证读取每行时不会丢失空格或特殊字符;跳过空行避免无效处理。 - 字段分割:用
awk处理多字符分隔符-,比cut更适配你的文本格式;同时用gsub清理每个字段前后的空格,保证时间、艺术家名称等格式干净。 - 输出文件名:把名称里的空格换成下划线,避免文件名带空格导致FFmpeg识别问题;
${inputFileName##*.}提取原音频的后缀,保证输出文件和原文件格式一致。 - FFmpeg命令优化:
-hide_banner -loglevel error减少冗余输出,只保留关键信息;-ss指定开始时间、-to指定结束时间,-c copy直接复制音频编码,速度极快且无质量损失(如果需要转码,可去掉-c copy换成-c:a mp3这类编码参数)。
使用步骤
- 把脚本保存为
split.command,放在和你的音频文件、test.txt同一目录下。 - 打开终端,给脚本添加执行权限:
chmod +x split.command - 修改脚本里的
inputFileName为你的实际音频文件名(记得加后缀,比如audiofile.mp3)。 - 运行脚本:
./split.command
内容的提问来源于stack exchange,提问作者Tony Hegr
相关产品推荐
相关产品推荐

