유튜브 영상 소리가 작게 들릴 때 ffmpeg로 -14 LUFS에 맞추는 법 — 재기, 1단계, 2단계
유튜브에 올린 영상만 소리가 작게 들린다면 파일의 소리 크기(LUFS)를 먼저 재 보면 됩니다. 무료 ffmpeg로 지금 크기를 재는 법, loudnorm으로 -14에 맞추는 1단계·2단계 방법, I=-14를 빠뜨리면 기본값 -24로 맞춰져 더 작아지는 함정을 실제로 돌려 본 결과와 함께 정리했습니다.
유튜브에 영상을 올리고 다른 영상을 보다 넘어오면, 내 영상만 소리가 작게 들릴 때가 있습니다. 제 영상도 소리 크기를 재 보니 -18, -19 LUFS였고, 그때는 확실히 작게 들렸습니다. 장비를 바꾸지 않고 무료 ffmpeg로 맞출 수 있습니다.
아래 명령은 ffmpeg 8.1.1에서 실제로 돌려 본 것입니다. 결과 숫자는 테스트용으로 만든 -19 LUFS짜리 소리 파일로 잰 값입니다.
왜 작게 들리나
유튜브는 재생할 때 영상마다 소리 크기를 맞춥니다. 많이 알려진 기준은 -14 LUFS로, 그보다 큰 영상은 줄여서 틀어주고 작은 영상은 키우지 않고 그대로 둔다고 알려져 있습니다. 유튜브가 공식 도움말에 이 숫자를 적어 둔 건 아니고, 여러 측정에서 같은 값이 나와서 기준처럼 쓰이는 숫자입니다.
그래서 -19로 올린 영상은 줄어든 다른 영상들보다 그대로 작게 나옵니다. LUFS는 사람이 느끼는 소리 크기를 잰 단위이고, 0에 가까울수록 큽니다.
1. 지금 크기부터 재기
ffmpeg -hide_banner -nostats -i input.mp4 -af ebur128=peak=true -f null -
출력 맨 끝 Summary에 나오는 I: 값이 파일 전체의 소리 크기입니다.
Summary:
Integrated loudness:
I: -19.0 LUFS
...
True peak:
Peak: -5.9 dBFS
peak=true를 붙이면 가장 큰 순간의 크기(True peak)도 같이 나옵니다. 키울 때 이 값이 0에 닿으면 소리가 깨지기 때문에 같이 봐 두는 게 좋습니다.
2. 1단계로 맞추기
가장 간단한 방법은 loudnorm 필터를 한 번 거는 것입니다.
ffmpeg -i input.mp4 -c:v copy \
-af loudnorm=I=-14:TP=-1.5 -ar 48000 \
-c:a aac -b:a 192k output.mp4
-c:v copy= 영상은 다시 인코딩하지 않고 그대로 둡니다I=-14= 목표 소리 크기TP=-1.5= 가장 큰 순간이 넘지 않을 선-ar 48000= 출력 샘플레이트를 48kHz로 고정
-ar 48000을 빼고 돌렸더니 출력 샘플레이트가 192000(192kHz)으로 나왔습니다. loudnorm이 안에서 샘플레이트를 올려서 처리하기 때문이라, 원래 쓰던 값으로 다시 적어 주는 게 좋습니다.
테스트 파일(-19.0)에 이 명령을 걸고 다시 재면 I: -14.0 LUFS가 나왔습니다.
3. I=-14를 빠뜨리면 더 작아진다
가장 쉽게 밟는 함정입니다. -af loudnorm만 적고 목표를 안 적으면 기본값으로 맞춥니다.
ffmpeg -hide_banner -h filter=loudnorm
# I set integrated loudness target (from -70 to -5) (default -24)
# LRA set loudness range target (from 1 to 50) (default 7)
# TP set maximum true peak (from -9 to 0) (default -2)
기본값이 -24입니다. 같은 테스트 파일에 -af loudnorm만 걸었더니 -19.0이던 소리가 -24.0이 됐습니다. 키우려고 돌렸는데 5 LU 더 작아진 셈입니다. -24는 방송 쪽 기준에 가까운 값이라, 유튜브용으로는 I=-14를 꼭 적어야 합니다.
4. 더 정확하게 맞추는 2단계
1단계는 파일을 읽으면서 바로 크기를 조절하기 때문에, 긴 영상에서는 목표에서 조금 벗어나거나 구간마다 크기가 출렁일 수 있습니다. 먼저 파일 전체를 잰 다음, 그 값을 넣어서 다시 돌리면 더 정확합니다.
첫 번째 실행에서는 재기만 하고 결과를 JSON으로 받습니다.
ffmpeg -hide_banner -nostats -i input.mp4 \
-af loudnorm=I=-14:TP=-1.5:print_format=json -f null -
{
"input_i" : "-19.05",
"input_tp" : "-5.90",
"input_lra" : "0.00",
"input_thresh" : "-29.05",
...
"target_offset" : "0.01"
}
두 번째 실행에서 이 값을 measured_ 옵션에 그대로 넣습니다.
ffmpeg -i input.mp4 -c:v copy \
-af "loudnorm=I=-14:TP=-1.5:measured_I=-19.05:measured_TP=-5.90:measured_LRA=0.00:measured_thresh=-29.05:offset=0.01:linear=true" \
-ar 48000 -c:a aac -b:a 192k output.mp4
테스트 파일에서는 I: -14.0 LUFS, Peak: -1.5 dBFS로 나왔습니다. linear=true는 가능하면 전체 소리를 같은 비율로만 키우라는 뜻입니다. 다만 원래 가장 큰 순간이 높아서 키우면 TP 선을 넘는 파일은, 1단계처럼 구간마다 조절하는 방식으로 바뀝니다. 이 테스트 파일도 그 경우였습니다.
zsh에서 이 값을 변수로 넣을 때 하나 걸린 게 있습니다. $OFF:linear처럼 변수 바로 뒤에 :l이 오면 zsh가 이걸 소문자로 바꾸라는 표시로 읽어서 l이 사라집니다. ${OFF}:linear처럼 중괄호로 감싸면 됩니다.
정리하면
- 먼저
ebur128로I:값을 잰다 - 맞출 때는
loudnorm=I=-14를 꼭 적는다 (안 적으면 -24) -ar 48000으로 샘플레이트를 다시 적는다- 정확하게 맞추고 싶으면 재고 나서 측정값을 넣어 한 번 더 돌린다
유튜브에 올린 뒤에는 영상 위에서 마우스 오른쪽 버튼을 눌러 전문가용 통계(Stats for nerds)를 열면, 유튜브가 이 영상을 얼마나 줄여서 틀고 있는지 볼 수 있습니다.