40 lines
1.7 KiB
Bash
40 lines
1.7 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# 排查 sofalizer 为什么没做出双耳差异
|
||
|
|
set -u
|
||
|
|
cd "/home/lou/桌面/工作区/实验/空间音频"
|
||
|
|
SOFA=/usr/share/libmysofa/MIT_KEMAR_normal_pinna.sofa
|
||
|
|
|
||
|
|
echo "===== 1. sofalizer 支持哪些参数 ====="
|
||
|
|
ffmpeg -hide_banner -h filter=sofalizer 2>&1 | sed -n '1,45p'
|
||
|
|
|
||
|
|
echo
|
||
|
|
echo "===== 2. 详细日志跑一次(找 hrtf/layout/channel 相关) ====="
|
||
|
|
ffmpeg -y -v verbose -i 51-test.wav \
|
||
|
|
-af "sofalizer=sofa=$SOFA:type=freq:radius=1.2" \
|
||
|
|
-c:a pcm_s16le /tmp/b2.wav 2>&1 | grep -iE "sofal|hrtf|layout|channel|error|warn|invalid|fail" | head -25
|
||
|
|
|
||
|
|
echo
|
||
|
|
echo "===== 3. 输出到底是什么布局 ====="
|
||
|
|
ffprobe -v error -show_entries stream=channels,channel_layout,codec_name -of default=nw=1 /tmp/b2.wav
|
||
|
|
|
||
|
|
echo
|
||
|
|
echo "===== 4. 单方向测试: 只有左前一个脉冲, 渲染后左耳该明显响于右耳 ====="
|
||
|
|
ffmpeg -y -hide_banner -loglevel error -f lavfi -i "anoisesrc=d=0.3:c=pink:a=0.7:r=48000" \
|
||
|
|
-af "pan=5.1|FL=c0|FR=0*c0|FC=0*c0|LFE=0*c0|BL=0*c0|BR=0*c0" -t 0.5 -c:a pcm_s16le /tmp/onlyFL.wav
|
||
|
|
ffmpeg -y -hide_banner -loglevel error -i /tmp/onlyFL.wav \
|
||
|
|
-af "sofalizer=sofa=$SOFA:type=freq:radius=1.2" -c:a pcm_s16le /tmp/FL_hrtf.wav
|
||
|
|
python3 - <<'PY'
|
||
|
|
import struct, wave
|
||
|
|
def chan(p, i):
|
||
|
|
with wave.open(p) as w:
|
||
|
|
ch, n = w.getnchannels(), w.getnframes()
|
||
|
|
raw = w.readframes(n)
|
||
|
|
s = struct.unpack("<%dh" % (len(raw)//2), raw)
|
||
|
|
return [float(s[j]) for j in range(i, len(s), ch)]
|
||
|
|
for label, path in (("输入(只有FL)", "/tmp/onlyFL.wav"), ("sofalizer 输出", "/tmp/FL_hrtf.wav")):
|
||
|
|
L, R = chan(path, 0), chan(path, 1)
|
||
|
|
el = sum(x*x for x in L) ** 0.5
|
||
|
|
er = sum(x*x for x in R) ** 0.5
|
||
|
|
print(" %-16s L能量=%9.1f R能量=%9.1f L/R=%.3f" % (label, el, er, (el/er) if er else 0))
|
||
|
|
PY
|