diff --git a/ffmpeg-eqmatch.sh b/ffmpeg-eqmatch.sh new file mode 100644 index 0000000..f9e67ea --- /dev/null +++ b/ffmpeg-eqmatch.sh @@ -0,0 +1,118 @@ +#!/bin/bash + +# ffmpeg-eqmatch.sh +# 這個 script 會自動將目標音訊檔案與參考檔案做 EQ Match。 +# 它首先分析兩個音訊檔案的響度值,計算它們在不同頻帶上的差異, +# 然後使用 FFmpeg 的 equalizer 濾鏡對目標音訊檔案進行 EQ 處理, +# 以使其頻率響應盡可能接近參考音訊檔案。 + +# 用法:ffmpeg-eqmatch.sh <參考檔案> <你想要處理的檔案> [強度(預設 0.3)] + +# 檢查是否提供了兩個輸入檔案 +if [ $# -lt 2 ] || [ $# -gt 3 ]; then + echo "請提供兩個聲音檔案作為參數,以及一個可選的強度值。" + echo "用法: $0 <參考檔案> <想要處理的檔案> [強度(預設 0.3)]" + exit 1 +fi + +# 將輸入檔案名存儲在變數中 +input_file1="$1" +input_file2="$2" + +# 如果提供了強度值,則使用它;否則,使用預設值 0.3 +if [ $# -eq 3 ]; then + strength="$3" +else + strength="0.3" +fi + +# 函數:用 ffmpeg 提取響度值 +get_loudness_values() { + local input_file="$1" + local result=$(ffmpeg -i "$input_file" -filter_complex " + aformat=channel_layouts=mono, + acrossover=split=40 80 160 320 480 640 800 1000 1500 2000 3000 4500 6000 10000 15000 + [a][b][c][d][e][f][g][h][i][j][k][l][m][n][o][p], + [a]ebur128, + [b]ebur128, + [c]ebur128, + [d]ebur128, + [e]ebur128, + [f]ebur128, + [g]ebur128, + [h]ebur128, + [i]ebur128, + [j]ebur128, + [k]ebur128, + [l]ebur128, + [m]ebur128, + [n]ebur128, + [o]ebur128, + [p]ebur128 + " -f null - 2>&1) + + local max_band=16 + local loudness_values=() + + for ((i=2; i<=max_band+1; i++)); do + local loudness=$(echo "$result" | sed -n "/\[Parsed_ebur128_${i}.*Summary:/,/LRA high:/ p" | grep "I:" | awk '{print $2}') + loudness_values+=("$loudness") + done + + echo "${loudness_values[@]}" +} + +# 獲取兩個輸入檔案的響度值 +echo "正在分析參考檔案的響度值..." +loudness_values1=($(get_loudness_values "$input_file1")) +echo "參考檔案分析完成。" + +echo "正在分析目標檔案的響度值..." +loudness_values2=($(get_loudness_values "$input_file2")) +echo "目標檔案分析完成。" + +# 計算兩個檔案響度值的差距 +loudness_diff=() +for ((i=0; i<${#loudness_values1[@]}; i++)); do + diff=$(echo "${loudness_values1[$i]} - ${loudness_values2[$i]}" | bc) + loudness_diff+=("$diff") +done + +# 輸出分析結果 +echo "參考檔案分析值:${loudness_values1[@]}" +echo "目標檔案分析值:${loudness_values2[@]}" +echo "差距:${loudness_diff[@]}" + +# 得到輸入檔案的基本名稱(不包括副檔名) +base_name=$(basename "$input_file2" | cut -d. -f1) + +# 構建輸出檔案名 +output_file="${base_name}_eqmatch_${strength}.wav" + +# 定義 equalizer 參數 +eq_params=( + "equalizer=f=30:t=q:w=1:g=$(echo "${loudness_diff[0]} * $strength" | bc)" + "equalizer=f=60:t=q:w=1:g=$(echo "${loudness_diff[1]} * $strength" | bc)" + "equalizer=f=120:t=q:w=1:g=$(echo "${loudness_diff[2]} * $strength" | bc)" + "equalizer=f=240:t=q:w=1:g=$(echo "${loudness_diff[3]} * $strength" | bc)" + "equalizer=f=400:t=q:w=1:g=$(echo "${loudness_diff[4]} * $strength" | bc)" + "equalizer=f=560:t=q:w=1:g=$(echo "${loudness_diff[5]} * $strength" | bc)" + "equalizer=f=720:t=q:w=1:g=$(echo "${loudness_diff[6]} * $strength" | bc)" + "equalizer=f=900:t=q:w=1:g=$(echo "${loudness_diff[7]} * $strength" | bc)" + "equalizer=f=1250:t=q:w=1:g=$(echo "${loudness_diff[8]} * $strength" | bc)" + "equalizer=f=1750:t=q:w=1:g=$(echo "${loudness_diff[9]} * $strength" | bc)" + "equalizer=f=2500:t=q:w=1:g=$(echo "${loudness_diff[10]} * $strength" | bc)" + "equalizer=f=3750:t=q:w=1:g=$(echo "${loudness_diff[11]} * $strength" | bc)" + "equalizer=f=5250:t=q:w=1:g=$(echo "${loudness_diff[12]} * $strength" | bc)" + "equalizer=f=8000:t=q:w=1:g=$(echo "${loudness_diff[13]} * $strength" | bc)" + "equalizer=f=12500:t=q:w=1:g=$(echo "${loudness_diff[14]} * $strength" | bc)" + "equalizer=f=17500:t=q:w=1:g=$(echo "${loudness_diff[15]} * $strength" | bc)" +) + +# 將 equalizer 參數連接成一個字串 +eq_filter_string=$(IFS=,; echo "${eq_params[*]}") + +# 使用 FFmpeg 對目標檔案進行 EQ 處理 +echo "正在對目標檔案進行 EQ 處理..." +ffmpeg -i "$input_file2" -af "$eq_filter_string,alimiter" "$output_file" +echo "EQ 處理完成。輸出檔案:$output_file"