Add files via upload
This commit is contained in:
118
ffmpeg-eqmatch.sh
Normal file
118
ffmpeg-eqmatch.sh
Normal file
@@ -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"
|
Reference in New Issue
Block a user