如何不使用临时文件改写获取音频LUFS值的Zsh脚本?
改写Zsh脚本避免临时文件,批量提取音频LUFS值
问题背景
作为音乐人,需要批量计算音频文件的LUFS值,原脚本依赖临时文件存储ffmpeg输出,希望改写为无临时文件的实现,此前尝试awk处理时出现首条结果重复的问题。
解决方案
直接在循环中处理每个文件的ffmpeg输出,通过管道将stderr重定向到awk,实时提取所需信息并写入CSV,无需临时文件:
#!/bin/zsh # 定义输出CSV路径,可自行修改 OutputCSV="$HOME/Desktop/LUFS_results.csv" # 初始化CSV文件(清空已有内容或创建新文件) > "$OutputCSV" # 遍历传入的所有音频文件 for CurrentFile in "$@" do # 获取文件名(不含路径) FileName=$(/usr/bin/basename "$CurrentFile") # 执行ffmpeg并通过awk过滤输出 /opt/homebrew/bin/ffmpeg -i "$CurrentFile" -hide_banner -af ebur128=framelog=verbose -f null - 2>&1 | awk -v fname="$FileName" ' # 匹配Integrated loudness的I值行 /^ I:/ { # 去掉行首的冗余前缀 sub(/^ I: /, "", $0); # 输出"文件名,LUFS值"格式的CSV行 print fname "," $0 } ' >> "$OutputCSV" done
关键说明
- 无临时文件设计:通过
2>&1将ffmpeg的标准错误输出(所有日志信息的输出位置)重定向到标准输出,直接通过管道传给awk处理,无需中间文件存储。 - 避免重复结果:原脚本中手动echo文件名到临时文件,再与ffmpeg输出混合提取,易因输出顺序或重复匹配导致结果重复。现在直接将文件名通过awk的
-v参数传入,与对应文件的LUFS值绑定输出,确保一一对应。 - 可扩展性:如果需要提取其他参数(如Threshold、LRA),只需在awk中添加匹配规则,例如:
/^ Threshold:/ { sub(/^ Threshold: /, "", $0); print fname ",Threshold," $0 }
内容的提问来源于stack exchange,提问作者tanzpartner
相关产品推荐
相关产品推荐

