Files
ffmpeg-eqmatch/ffmpeg-eqmatch.sh
2024-05-13 12:26:55 +08:00

119 lines
4.2 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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"