Add files via upload

This commit is contained in:
Wiwi Kuan
2024-05-13 12:26:55 +08:00
committed by GitHub
parent 18b6a1d78e
commit 0411279455

118
ffmpeg-eqmatch.sh Normal file
View 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"