설치 · 사용법

FFmpeg 음량 정규화 — loudnorm 2단계 측정·출력 확인

한줄 요약

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. 1. 실행 파일과 입력 사본 준비

    공식 실행용 빌드의 bin 폴더에서 PowerShell을 열고, 중요하지 않은 WAV 사본을 검수 원본.wav로 준비합니다. 출력은 다른 이름 정규화 사본.wav으로 정합니다.

  2. 2. 입력 음량 측정

    첫 명령으로 파일을 끝까지 측정하고 마지막 JSON의 input_i, input_tp, input_lra, input_thresh, target_offset을 기록합니다. 이 단계는 출력 파일을 만들지 않습니다.

  3. 3. 측정값의 유효성 확인

    값5개에 -inf·inf·NaN이 있거나 JSON이 없으면 중단합니다. 아래 시험 수치가 아닌 자기 입력의 실제 값을 두 번째 실행에 사용하세요.

  4. 4. 다른 이름으로 사본 출력

    같은 I·TP·LRA 목표와 실제 측정값으로 두 번째 명령을 실행합니다. -n으로 덮어쓰기를 막고 48kHz PCM WAV를 출력합니다.

  5. 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에서 파일 준비

  1. 공식 허브가 연결하는 실행용 Windows 빌드에서 ffmpeg.exe·ffprobe.exe가 있는 bin 폴더를 찾습니다. 해당 폴더에서 PowerShell을 열면 아래 상대 경로 명령을 사용할 수 있습니다.
  2. 먼저 중요하지 않은 WAV 한 파일을 검수 원본.wav 이름으로 같은 폴더에 준비합니다. 실제 원본은 다른 곳에 보관하고 WAV가 정상 재생되는지 확인하세요.
  3. 출력 이름 정규화 사본.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를 시험했습니다. 사용자 파일을 쓰거나 실제 음질을 청취 평가한 시험은 아닙니다.

예시 목표 I=-16 · TP=-1.5 · LRA=11의 자체 시험
확인 항목 관찰 결과
첫 입력 측정 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. 참고 자료

함께 보면 좋은