특정 정수 MB 이하로 비디오를 포함해야 하는 상황은 많습니다. 채널 업로드 상한, 이메일 첨부 상한, 사내 스토리지의 단일 파일 제한 등이 있습니다. Discord 무료 용량이 대략 20MB, 이메일이 대략 25MB라는 수치는 그러한 제약의 이해하기 쉬운 예에 불과합니다.
본 메모는 ffmpeg(H.264 / libx264)을 사용하여 '지정 크기'를 목표로 할 때의 절차 요약입니다. 품질 우선 방식인 CRF와, 상한선에서 역산하는 목표 비트레이트 사용법을 중심으로 작성했습니다.
개발 과정에서 필요한 것은 대략 다음 세 가지입니다.
- 상대방의 상한 용량에 맞춰야 함
- 코드나 UI의 문자가 읽힐 수 있어야 함
- 시도 횟수를 줄여야 함
'가능한 한 작게'와 '19MB 이하로 확실하게'는 별개의 문제입니다. 전자는 CRF만으로 충분할 때가 많습니다. 후자의 경우, 용량 상한에서 비트레이트를 역산하지 않으면, 1MB가 부족하거나 문자가 깨지는 과정을 반복하기 쉽습니다.
CRF(Constant Rate Factor)는 품질 목표에 맞춰 비트레이트를 조정합니다. 값이 작을수록 고품질이며 파일이 커지기 쉽습니다.
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k out.mp4
preset는 (ultrafast~veryslow) 속도와 압축 효율에 관한 것이며, '몇 MB가 될지'를 직접적으로 결정하지 않습니다.
CRF 방식이 적합하지 않은 이유는 다음과 같습니다.
- 크기를 직접 지정할 수 없음: 같은 CRF 값이라도 길이(尺), 해상도, 화면의 복잡성에 따라 결과가 달라집니다.
- 시도 비용이 높음: 20MB에 맞추기 위해 CRF를 23→26→28 등으로 여러 번 반복해야 합니다.
- 가독성을 떨어뜨리기 쉬움: 확실하게 작게 만들려고 CRF를 너무 느슨하게 하면, 녹화된 영상 속 글꼴이 깨질 수 있습니다.
품질 우선이고 크기는 대략 괜찮다면 CRF를 사용합니다. 하지만 엄격한 상한선이라면 다음 절을 참고하세요.
대략 다음 공식으로 총 비트레이트를 추정할 수 있습니다 (컨테이너 등의 여유분은 별도로 확보해야 합니다).
목표 총 비트레이트(kbps) ≈ 목표 크기(MB) × 8 × 1024 / 길이(초)
비디오 비트레이트 = 총 비트레이트 − 오디오 비트레이트. 실무에서는 목표 크기의 90~95%로 계산하거나, 오디오를 제외한 후 0.9를 곱합니다.
예시: 180초 분량의 화면 녹화를 약 19MB로 만들고 싶을 때 (Discord ≈20MB 여유 공간).
총 비트레이트 ≈ 19 × 8 × 1024 / 180 ≈ 865 kbps
오디오 96 kbps → 비디오는 약 770 kbps
여기에 10% 여유분 확보 → 비디오 700 kbps부터 시도
길이(尺)를 얻는 방법:
ffprobe -v error -show_entries format=duration -of default=nw=1:nk=1 input.mp4
1-pass 예시:
ffmpeg -i input.mp4 \
-c:v libx264 -b:v 700k -maxrate 700k -bufsize 1400k \
-preset medium -c:a aac -b:a 96k \
...
-maxrate / -bufsize로 순간적인 급증을 억제합니다. 여전히 크다면 -b:v를 낮추거나, 먼저 해상도를 낮춥니다.
복잡한 구간에서 1-pass가 과도하게 커지기 쉬울 때는 2-pass 방식을 사용합니다.
# pass 1
ffmpeg -y -i input.mp4 -c:v libx264 -b:v 700k -pass 1 -an -f null /dev/null
# pass 2
...
Windows 환경에서는 null 출력이 NUL입니다. pass 1의 로그(예: ffmpeg2pass-0.log)는 같은 디렉토리에서 pass 2가 읽습니다. 느리지만, 목표에 가까워지기 쉽고 '아직 1.5MB'와 같은 재인코딩을 줄일 수 있습니다.
이메일 첨부가 대략 25MB라면, 동일한 공식으로 목표를 23~24MB로 설정하기만 하면 됩니다. 생각하는 방식은 변하지 않습니다.
여전히 용량이 초과된다면, 비트레이트를 더 줄이기 전에 다음을 확인하세요.
해상도를 낮추기
ffmpeg -i input.mp4 -vf "scale=-2:720" \
-c:v libx264 -b:v 700k -c:a aac -b:a 96k out.mp4
1080p의 데모 녹화라도, 기술 공유 목적이라면 720p로도 문자가 읽히는 경우가 많습니다. -2는 짝수 폭을 유지하기 위함입니다.
음성 줄이기
화면 녹화와 음성만 있는 경우라면 AAC 96kbps로 충분한 경우가 많습니다. 음악 비중이 높다면 128kbps가 적절합니다. 음성을 32kbps 낮추면, 긴 길이의 영상에서는 영상 자체의 예산(비트레이트)이 늘어납니다.
추천 순서: 불필요한 길이 자르기 → 필요하다면 스케일 조정(scale) → 수식으로 목표 비트레이트 설정 (가능하면 2-pass) → 마지막에 품질 크게 낮추기. 먼저 길이를 짧게 하는 것이 같은 크기에서도 가독성을 유지하기 쉽습니다.
배치(batch)나 CI 환경에서는 자체 구축한 ffmpeg가 첫 번째 선택지입니다. 가끔 단 한 개만 압축하고 싶거나, 파라미터를 외우고 싶지 않을 때만 기존 도구로 처리하는 선택지도 있습니다. VideoBee의 비디오 압축 기능은 Basic 플랜에서 목표 크기를 설정할 수 있습니다. 워터마크 없음/등록 불필요. 클라우드 처리이며, 결과물은 약 24시간 후 삭제되고 AI 학습에 사용하지 않는다고 명시되어 있습니다. 압축 상한선은 대략 10GB입니다. 명령어의 대체재라기보다는 "관리하고 싶지 않은 날"을 위한 임시방편 정도입니다.
image.png
| 목적 | 적합한 수단 |
|---|
| 품질 우선・크기는 참고치 | CRF + preset |
| ... | |
| 지정된 MB는 "품질에 대한 감각"을 "비트레이트 예산(bitrate budget)"으로 대체하는 작업입니다. 수식 자체는 간단하며, 여유 공간을 남기는 것이 핵심입니다. Discord 20MB나 이메일 25MB는 그 예산에 담을 수 있는 상한선의 예시일 뿐입니다. | |