29 lines
1.7 KiB
Python
29 lines
1.7 KiB
Python
"""생성기/manifest 통계를 사용하지 않는 전용 ebur128 릴리스 측정 증거."""
|
|
import hashlib
|
|
import json
|
|
from pathlib import Path
|
|
import re
|
|
import subprocess
|
|
|
|
ROOT = Path(__file__).resolve().parents[3]
|
|
EVIDENCE = Path(__file__).resolve().parent
|
|
rows = []
|
|
for path in sorted((ROOT/'public/ambience').glob('*.wav')):
|
|
command = ['ffmpeg','-nostdin','-hide_banner','-i',str(path),'-af','ebur128=peak=true','-f','null','-']
|
|
digest = hashlib.sha256(path.read_bytes()).hexdigest()
|
|
result = subprocess.run(command, check=True, capture_output=True, text=True, timeout=30)
|
|
summary = result.stderr.rsplit('Summary:',1)[1]
|
|
integrated = float(re.search(r'I:\s+([-\d.]+) LUFS',summary)[1])
|
|
peak = float(re.search(r'Peak:\s+([-\d.]+) dBFS',summary)[1])
|
|
assert hashlib.sha256(path.read_bytes()).hexdigest() == digest
|
|
rows.append({'file':str(path.relative_to(ROOT)), 'sha256':digest, 'bytes':path.stat().st_size,
|
|
'integratedLUFS':integrated, 'truePeakDBTP':peak, 'rawSummary':summary})
|
|
spread=max(r['integratedLUFS'] for r in rows)-min(r['integratedLUFS'] for r in rows)
|
|
passed=len(rows)==8 and spread<=0.4 and all(abs(r['integratedLUFS']+32.5)<=0.2 and r['truePeakDBTP']<=-6 for r in rows)
|
|
report={'measurementFilter':'ebur128=peak=true','targetIntegratedLUFS':-32.5,'toleranceLU':0.2,'maximumSpreadLU':0.4,
|
|
'truePeakCeilingDBTP':-6,'ffmpegVersion':subprocess.check_output(['ffmpeg','-version'],text=True).splitlines()[0],
|
|
'scriptSha256':hashlib.sha256(Path(__file__).read_bytes()).hexdigest(), 'spreadLU':spread,'passed':passed,'files':rows}
|
|
with (EVIDENCE/'ebur128-results.json').open('x') as stream: stream.write(json.dumps(report,indent=2)+'\n')
|
|
print(json.dumps(report,indent=2))
|
|
assert passed
|