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

如何不使用临时文件改写获取音频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

关键说明

  1. 无临时文件设计:通过2>&1将ffmpeg的标准错误输出(所有日志信息的输出位置)重定向到标准输出,直接通过管道传给awk处理,无需中间文件存储。
  2. 避免重复结果:原脚本中手动echo文件名到临时文件,再与ffmpeg输出混合提取,易因输出顺序或重复匹配导致结果重复。现在直接将文件名通过awk的-v参数传入,与对应文件的LUFS值绑定输出,确保一一对应。
  3. 可扩展性:如果需要提取其他参数(如Threshold、LRA),只需在awk中添加匹配规则,例如:
    /^    Threshold:/ { 
        sub(/^    Threshold: /, "", $0); 
        print fname ",Threshold," $0 
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:44:56