목차
한줄 요약
WAV 한 파일의 음량을 맞추려면 먼저 측정한 값5개를 같은 목표의 두 번째 실행에 넣고, 새 출력 파일을 다시 측정하세요. -inf가 나오면 중단하고 원본은 보관합니다. -16LUFS·-1.5dBTP·LRA11은 이 절차의 예시값입니다.
1. 기본 정보
- 대상
- FFmpeg를 선택한 사용자의 WAV 1개
- 예제 환경
- Windows PowerShell · FFmpeg9.0.2
- 작업 순서
- 입력 측정 → 새 사본 출력 → 출력 재측정
- 예시 목표
- I=-16 · TP=-1.5 · LRA=11
- 사본 형식
- 48kHz · 16bit PCM WAV
- 중단 조건
- 비유한 측정값·출력 거부·결과 확인 실패
2. WAV 한 파일의 측정·출력 순서
-
1. 실행 파일과 입력 사본 준비
공식 실행용 빌드의 bin 폴더에서 PowerShell을 열고, 중요하지 않은 WAV 사본을
검수 원본.wav로 준비합니다. 출력은 다른 이름정규화 사본.wav으로 정합니다. -
2. 입력 음량 측정
첫 명령으로 파일을 끝까지 측정하고 마지막 JSON의 input_i, input_tp, input_lra, input_thresh, target_offset을 기록합니다. 이 단계는 출력 파일을 만들지 않습니다.
-
3. 측정값의 유효성 확인
값5개에 -inf·inf·NaN이 있거나 JSON이 없으면 중단합니다. 아래 시험 수치가 아닌 자기 입력의 실제 값을 두 번째 실행에 사용하세요.
-
4. 다른 이름으로 사본 출력
같은 I·TP·LRA 목표와 실제 측정값으로 두 번째 명령을 실행합니다.
-n으로 덮어쓰기를 막고 48kHz PCM WAV를 출력합니다. -
5. 출력 재측정과 재생 확인
새 파일을 다시 측정한 로그의 input_i·input_tp를 읽고 길이·표본율·재생을 비교합니다. 실패하거나 결과가 목적에 맞지 않으면 원본으로 돌아가세요.
3. 이 절차를 사용할 작업
이미 FFmpeg를 선택했고 WAV 한 파일의 측정값으로 음량을 맞추려는 작업을 다룹니다. 배포판과 CLI·GUI 선택은 FFmpeg 다운로드와 배포판 판단에서 확인하세요. 영상을 기기용으로 변환하며 오디오를 조절하는 경우에는 HandBrake의 Gain·DRC 적용 조건을 먼저 비교할 수 있습니다.
loudnorm은 통합 음량과 true peak 등을 측정해 음성을 처리하는 필터입니다. 소음 제거·음질 복원 기능이 아니며 이 절차는 음성을 재인코딩합니다. 음악/음성 품질, 여러 파일 반복 처리, 동영상의 트랙 선택까지 검증한 예제로 확대하지 마세요.
목표값은 작업에 맞게 정하기
아래 I=-16LUFS, TP=-1.5dBTP, LRA=11은 시험을 재현하기 위한 예시입니다. 모든 플랫폼의 표준이나 권장값이 아닙니다. 목표를 바꾸면 첫 측정과 두 번째 출력에 같은 목표를 사용해 다시 진행하세요.
4. PowerShell에서 파일 준비
- 공식 허브가 연결하는 실행용 Windows 빌드에서 ffmpeg.exe·ffprobe.exe가 있는 bin 폴더를 찾습니다. 해당 폴더에서 PowerShell을 열면 아래 상대 경로 명령을 사용할 수 있습니다.
- 먼저 중요하지 않은 WAV 한 파일을
검수 원본.wav이름으로 같은 폴더에 준비합니다. 실제 원본은 다른 곳에 보관하고 WAV가 정상 재생되는지 확인하세요. - 출력 이름
정규화 사본.wav이 아직 없는지 확인합니다. 이미 있다면 다른 새 이름을 정하고 아래 출력·재측정 명령에도 같은 이름을 사용하세요.
실행 확인: .\ffmpeg.exe -version. 파일을 찾지 못하면 현재 폴더와 실제 배포의 bin 경로를 확인하세요. PATH 변경이나 관리자 실행을 이 작업의 필수 단계로 만들 필요는 없습니다.
원본 보존을 비교하려면 작업 전과 후에 같은 입력의 SHA256을 기록할 수 있습니다: Get-FileHash -LiteralPath ".\검수 원본.wav" -Algorithm SHA256. 해시가 같아도 출력 재생·음량 확인을 대신하는 것은 아닙니다.
5. 입력 파일 측정과 중단 조건
아래 명령은 음성 전체를 분석하고 마지막 JSON을 표시합니다. -f null -은 분석 결과를 파일로 저장하지 않는 출력입니다. JSON은 진행 로그와 함께 PowerShell 화면에 표시될 수 있습니다.
.\ffmpeg.exe -hide_banner -nostdin -i ".\검수 원본.wav" -af "loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json" -f null -
| JSON 필드 | 두 번째 옵션 | 읽을 의미 |
|---|---|---|
| input_i | measured_I | 입력의 통합 음량 · LUFS |
| input_tp | measured_TP | 입력의 true peak · dBTP |
| input_lra | measured_LRA | 입력의 음량 범위 |
| input_thresh | measured_thresh | 입력의 측정 임계값 |
| target_offset | offset | 해당 목표에서 계산된 오프셋 |
비유한 값이면 진행 중단
값5개 중 -inf·inf·NaN이 있으면 아래 사본 출력에 넣지 마세요. 무음이나 매우 짧은 입력에서는 통합 음량이 측정되지 않을 수 있습니다. 숫자를 임의로 0으로 바꾸거나 다른 파일의 수치를 빌려 넣지 않습니다. 파일/로그를 확인하고 측정 가능한 입력으로 다시 시작하세요.
JSON이 없거나 읽기·디코딩 오류가 나오면 첫 단계부터 실패한 것입니다. 분석 명령을 실행했다는 사실만으로 측정 완료로 판단하지 마세요.
6. 자기 측정값을 PowerShell 변수에 입력
아래 숫자는 자체 시험 WAV에서 나온 값입니다. 자기 입력의 첫 JSON 값으로 오른쪽 숫자5개를 모두 바꾼 뒤 PowerShell에서 각 줄을 실행하세요. 소수점은 점을 사용하고 숫자 문자열을 따옴표 안에 넣습니다. 목표값이나 입력을 바꾸면 값을 새로 구해야 합니다.
$measuredI = "-30.75"
$measuredTP = "-24.44"
$measuredLRA = "9.10"
$measuredThreshold = "-40.75"
$targetOffset = "-2.48"
두 번째 명령의 ${measuredI} 같은 표기는 위 변수의 값을 읽는 PowerShell 문법입니다. 중괄호·달러 기호를 지우지 마세요. 이 예제는 측정값을 자동 추출하는 일괄 처리 스크립트가 아닙니다.
7. 새 WAV 사본 출력과 선형·동적 처리
.\ffmpeg.exe -hide_banner -nostdin -n -i ".\검수 원본.wav" -af "loudnorm=I=-16:TP=-1.5:LRA=11:measured_I=${measuredI}:measured_TP=${measuredTP}:measured_LRA=${measuredLRA}:measured_thresh=${measuredThreshold}:offset=${targetOffset}:linear=true:print_format=json" -ar 48000 -c:a pcm_s16le ".\정규화 사본.wav"
-n은 기존 출력 덮어쓰기를 거부합니다. 이미 파일이 있으면 already exists. Exiting. 같은 메시지를 확인하고 새 이름을 정하세요. 이번 시험 빌드는 기존 출력 거부 때 종료 코드가 0으로 나타났으므로, 종료 코드만 보고 성공으로 판단하면 안 됩니다. 새 출력의 생성 여부와 오류 로그를 함께 확인하세요.
linear=true는 무조건 선형 출력을 강제하는 약속이 아닙니다. 측정값이 모두 제공돼야 하며, 목표 LRA가 입력 LRA보다 작거나 선형 증폭이 true peak 목표를 넘기면 dynamic 처리로 바뀔 수 있습니다. 마지막 JSON의 normalization_type을 실제로 읽으세요.
dynamic 모드에서는 true peak 계산을 위해 내부적으로 192kHz로 처리하므로 출력 표본율을 명시합니다. 이 예제의 -ar 48000은 출력48kHz, -c:a pcm_s16le는 16bit PCM WAV를 뜻합니다. 압축 음원의 비트 단위 무손실 처리나 품질 향상을 보장하는 설정이 아닙니다.
8. 출력 파일을 다시 측정해 확인
두 번째 실행 로그의 output_i·output_tp만으로 결과를 확정하지 마세요. 새 출력 파일을 아래 명령의 입력으로 열어 다시 측정합니다.
.\ffmpeg.exe -hide_banner -nostdin -i ".\정규화 사본.wav" -af "loudnorm=I=-16:TP=-1.5:LRA=11:print_format=json" -f null -
- 이번 JSON의
input_i가 완성된 출력의 통합 음량입니다. 자기 목표와 비교하고input_tp가 정한 peak 상한을 넘지 않는지 확인하세요. 이 재측정 로그의 output_i는 다시 필터를 통과했을 때의 값이므로 혼동하지 않습니다. - 길이·표본율·채널을 원본과 비교하고 실제 사용할 플레이어에서 재생해 끊김·과도한 음량·원치 않는 결과가 없는지 확인합니다. 수치만 맞는 것이 청취 품질 보장은 아닙니다.
- 원본과 사본을 구별해 보관합니다. 출력 검증에 실패하거나 작업 목적에 맞지 않으면 원본으로 돌아가고, 새 목표를 시험할 때도 원본을 덮어쓰지 마세요.
파일 정보 확인: .\ffprobe.exe -v error -show_entries stream=codec_name,sample_rate,channels -show_entries format=duration -of json ".\정규화 사본.wav". 입력도 비교하려면 마지막 파일명만 검수 원본.wav로 바꿔 다시 실행하세요. sample_rate·duration·channels를 확인합니다.
9. 자체 WAV에서 확인한 결과
FFmpeg9.0.2 Gyan essentials 빌드와 Windows PowerShell에서 직접 생성한 24초 mono48kHz PCM WAV를 시험했습니다. 사용자 파일을 쓰거나 실제 음질을 청취 평가한 시험은 아닙니다.
| 확인 항목 | 관찰 결과 |
|---|---|
| 첫 입력 측정 | input_i -30.75LUFS · input_tp -24.44dBTP |
| 두 번째 처리 | normalization_type linear |
| 새 출력 재측정 | input_i -16.05LUFS · input_tp -9.69dBTP |
| 출력 파일 | 48kHz · mono · 24초 · PCM16bit |
| 파일 보존 | 원본 SHA256 동일 · 기존 출력 거부 후 사본 SHA256 동일 |
| 별도 조건 시험 | 목표 LRA1에서 dynamic 전환 · 무음8초/0.1초 입력에서 -inf |
시험의 출력 true peak는 -1.5에 꼭 도달하는 목표가 아니라 상한 안에 있는지 확인하는 값입니다. 결과와 target_offset은 입력·목표·빌드에 따라 달라질 수 있습니다. 이 수치를 자기 파일의 출력 예상값으로 복사하지 마세요.
10. 자주 묻는 질문
첫 측정 없이 linear=true만 쓰면 2단계인가요?
+
아닙니다. 첫 측정의 실제 값5개를 동일한 목표의 두 번째 실행에 넣어야 합니다. linear=true만으로 선형 결과도 보장하지 않습니다.
-inf가 나오면 값을 0으로 바꿔도 되나요?
+
임의 숫자로 바꾸지 마세요. 무음·매우 짧은 입력·측정 오류를 확인하고 측정 가능한 입력으로 다시 시작합니다. 비유한 값은 사본 출력으로 넘기지 않습니다.
두 번째 실행의 output_i와 최종 파일 측정이 왜 다른가요?
+
필터 실행 로그의 수치와 완성된 파일을 다시 입력으로 측정한 수치가 다를 수 있습니다. 새 출력 파일의 재측정 JSON에서 input_i·input_tp를 읽어 확인하세요.
HandBrake의 Gain·DRC·normalize-mix와 같나요?
+
Gain은 음량 증감, DRC는 적용 가능한 AC3 입력의 다이내믹 레인지 압축, normalize-mix는 믹스의 클리핑 방지입니다. 이 가이드의 통합 LUFS 측정→실제 값 입력→재측정 절차와 같은 기능으로 설명하지 않습니다.
11. 참고 자료
함께 보면 좋은