H.264(AVC) 비디오 코덱 완전 가이드 | 프로파일·FFmpeg·스트리밍 실전
이 글의 핵심
H.264(AVC)는 여전히 가장 넓게 쓰이는 비디오 코덱—호환성·도구 생태계·실전 FFmpeg 설정을 한 번에 정리합니다.
들어가며
H.264 / AVC(Advanced Video Coding)는 2000년대 중반 이후 가장 널리 배포된 손실 압축 비디오 코덱입니다. 방송, OTT, 모바일 카메라, 화상 회의, 게임 녹화까지 거의 모든 플랫폼에서 하드웨어 디코더가 기본 탑재되어 있어, “한 번 인코딩해 두면 어디서든 재생된다”는 실무 기준이 여전히 H.264를 가리킵니다.
다만 HEVC·AV1 대비 압축 효율은 낮은 편이고, 특허·라이선스 이슈를 염두에 둔 배포 전략이 필요합니다. 이 글은 압축 파이프라인을 이해한 뒤, FFmpeg로 바로 쓸 수 있는 설정까지 연결하는 것을 목표로 합니다.
이 글을 읽으면
- H.264의 블록 구조·프로파일·레벨을 업무 언어로 설명할 수 있습니다
- Intra/Inter 예측 → 변환·양자화 → 엔트로피 코딩 흐름을 개념적으로 잡을 수 있습니다
- libx264, NVENC/VAAPI 등으로 품질·속도·호환성을 균형 있게 맞출 수 있습니다
- YouTube·모바일·브라우저 환경에서의 위치와 자주 겪는 문제를 정리할 수 있습니다
목차
코덱 개요
역사 및 개발 배경
H.264는 ITU-T VCEG와 ISO/IEC MPEG의 공동 프로젝트 JVT(Joint Video Team)에서 표준화되었고, MPEG-4 Part 10 및 ITU-T H.264로 공개되었습니다. 기존 MPEG-2·MPEG-4 Part 2(예: DivX/Xvid 계열) 대비 동일 품질에서 대략 절반 이하 비트레이트를 목표로 설계되었고, 네트워크 스트리밍과 저지연 실시간을 염두에 둔 도구(슬라이스, 참조 프레임 등)가 풍부합니다.
기술적 특징
- 매크로블록 기반: 일반적으로 16×16 루마 매크로블록(크로마는 서브샘플링에 따라 8×8 등) 단위로 인코딩합니다.
- 가변 블록 크기: Inter 예측에서 16×16 ~ 4×4 파티션으로 세분화해 움직임에 맞춥니다.
- 다중 참조·B-프레임: 과거·미래 프레임을 참조해 시간 중복을 제거합니다(프로파일에 따라 B-프레임 사용이 달라짐).
- 인트라 예측: 4×4·16×16 모드로 공간적 상관을 활용합니다.
- Deblocking 필터: 블록 경계 아티팩트를 완화합니다.
주요 프로파일 및 레벨
프로파일은 어떤 코딩 도구를 쓸 수 있는지를 제한합니다.
| 프로파일 | 특징 | 흔한 사용처 |
|---|---|---|
| Baseline | B-프레임 제한, 일부 도구 단순 | 구형 모바일, 실시간 스트림 |
| Main | B-프레임, CABAC 등 | 방송·일반 VOD |
| High | 8×8 변환, 더 넓은 색 정보 표현 등 | Blu-ray, 고품질 아카이브 |
레벨(Level)은 해상도·프레임레이트·비트레이트 상한 등 디코더 복잡도를 규격화합니다(예: Level 4.1은 1080p 고프레임에 자주 사용). 컨테이너나 단말 스펙에 맞춰 프로파일/레벨 호환을 맞추는 것이 중요합니다.
압축 원리
Intra / Inter 예측
- Intra( I-슬라이스/프레임 ): 같은 프레임 안에서만 예측합니다. 키프레임·장면 전환 이후에 비트를 많이 씁니다.
- Inter( P/B ): 이미 디코딩된 프레임에서 블록 단위 모션 벡터로 예측하고, 잔차(residual)만 남깁니다. 움직임이 단순할수록 비트가 줄어듭니다.
Transform & Quantization
잔차 블록은 DCT 계열 정수 변환(4×4·8×8)으로 주파수 영역으로 옮긴 뒤, 양자화(Quantization)로 고주파·작은 계수를 버리거나 줄입니다. 양자화 스텝이 크면 파일은 작아지지만 밴딩(banding)·블러가 늘어납니다. x264의 CRF(Constant Rate Factor)는 사실상 이 “품질 대 가독성” 균형을 한 숫자로 잡는 방식으로 이해하면 실무 협업이 쉬워집니다.
Entropy Coding
H.264는 CAVLC(문맥 적응 가변 길이)와 CABAC(문맥 적응 이진 산술)을 사용합니다. CABAC은 압축 효율이 더 좋지만 디코딩 부하가 조금 큽니다(Main/High에서 흔함).
압축 파이프라인 다이어그램
flowchart LR
subgraph input [입력]
YUV[YUV 픽셀]
end
subgraph pred [예측]
Intra[Intra 예측]
Inter[Inter 예측]
end
subgraph residual [잔차 처리]
TQ[Transform & Quantize]
end
subgraph bits [비트스트림]
EC[Entropy Coding]
BS[H.264 NAL Units]
end
YUV --> Intra
YUV --> Inter
Intra --> TQ
Inter --> TQ
TQ --> EC
EC --> BS
실전 인코딩
아래 예제는 FFmpeg가 설치되어 있다고 가정합니다(ffmpeg -version으로 확인).
품질 우선(아카이브): libx264 + CRF
ffmpeg -i input.mov -c:v libx264 -crf 18 -preset slow -pix_fmt yuv420p \
-c:a aac -b:a 192k output.mp4
-crf: 보통 18~23(낮을수록 고품질). 방송 아카이브는 18 전후, 웹 배포는 20~23이 흔합니다.-preset:ultrafast~veryslow. 느릴수록 같은 CRF에서 효율이 조금 좋아지는 경우가 많습니다.
목표 비트레이트(스트리밍용)
ffmpeg -i input.mov -c:v libx264 -b:v 5M -maxrate 5M -bufsize 10M \
-pix_fmt yuv420p -c:a aac -b:a 192k output.mp4
VBR에 가깝게 쓰려면 **-maxrate / -bufsize**를 함께 지정하는 패턴이 많습니다.
2-pass(파일 크기·품질 예측이 중요할 때)
ffmpeg -y -i input.mov -c:v libx264 -b:v 4M -preset slow -pass 1 -an -f mp4 /dev/null
ffmpeg -i input.mov -c:v libx264 -b:v 4M -preset slow -pass 2 -c:a aac -b:a 192k output.mp4
Windows에서는 /dev/null 대신 **NUL**을 사용합니다.
NVIDIA NVENC(속도 우선)
ffmpeg -hwaccel cuda -i input.mov -c:v h264_nvenc -cq 23 -preset p5 \
-pix_fmt yuv420p -c:a aac -b:a 192k output.mp4
드라이버·GPU 세대에 따라 -preset 옵션 이름이 다를 수 있으니 ffmpeg -h encoder=h264_nvenc로 확인하세요.
파라미터 튜닝 가이드
| 목표 | 권장 방향 |
|---|---|
| 호환성 최우선 | -profile:v high -level 4.0, -pix_fmt yuv420p |
| 저지연 라이브 | -tune zerolatency, B-프레임 줄이기, 버퍼 작게 |
| 필름·그레인 보존 | -tune film, CRF 약간 낮추기(그레인은 비트를 많이 먹음) |
| 애니/평면 | -tune animation 검토 |
품질 vs 속도 트레이드오프
- 같은 CRF에서 preset을 한 단계 느리게 하면 인코딩 시간은 늘지만 동일 품질·동일 파일 크기에 더 가까워지는 경우가 많습니다.
- 실시간이면 하드웨어 인코더 또는 ultrafast + 적절한 비트레이트가 현실적입니다.
- 아카이브 한 번이면 느린 preset + CRF가 장기적으로 유리한 경우가 많습니다.
성능 비교
다른 코덱과의 압축률(대략적인 경향)
동일 시각 품질 기준으로 일반적으로 HEVC > H.264, AV1 ≥ HEVC(콘텐츠·인코더에 따라 다름) 정도로 이해하면 됩니다. H.264는 기준선(baseline)으로 두고, 대역폭이 절대적으로 부족한지·디코더 호환이 가능한지로 상위 코덱을 선택합니다.
인코딩·디코딩 속도
- 디코딩: H.264는 거의 모든 기기에서 HW 디코딩이 가능해 전력 효율이 좋습니다.
- 인코딩: libx264는 품질 대비 매우 효율적이지만 실시간 4K에는 GPU 인코더가 자주 쓰입니다.
하드웨어 가속 지원
- Intel: Quick Sync(
h264_qsv등, 플랫폼·FFmpeg 빌드에 따름) - NVIDIA: NVENC
h264_nvenc - Apple: VideoToolbox(
h264_videotoolbox) - AMD: AMF(
h264_amf)
배포 전 목표 기기에서 실제 디코딩을 확인하세요.
실무 활용 사례
스트리밍 서비스 (YouTube, Netflix 등)
- YouTube는 업로드 후 자체적으로 다중 코덱·해상도로 트랜스코딩합니다. 업로드 원본은 편집 코덱(ProRes 등) 또는 고비트 H.264/H.265가 흔합니다.
- Netflix 등 대형 OTT는 HDR·다국어 자막·DRM까지 포함한 복잡한 패키징을 사용합니다. 시청 단말에 따라 H.264만 지원하는 레거시도 여전히 존재합니다.
모바일 앱
- iOS·Android 모두 H.264 디코딩이 사실상 기본입니다. Baseline/Main으로 제한해야 하는 구형 단말이 있으면 프로파일 검증이 필요합니다.
웹 브라우저 지원
- MP4(H.264 + AAC)는 거의 모든 브라우저에서 재생됩니다. Safari 포함 광범위 호환이 필요하면 H.264가 여전히 최저 위험 선택입니다.
- WebRTC 실시간 영상에서도 H.264는 호환 코덱으로 자주 등장합니다.
최적화 팁
품질 유지하며 파일 크기 줄이기
- 해상도·프레임레이트를 먼저 조정하는 것이 비트레이트 절감에 가장 큽니다.
- 오디오는 음성만이면 AAC 96~128k, 음악 중심이면 192~256k 등으로 합리화합니다.
- CRF + 느린 preset으로 “비트 낭비”를 줄입니다.
인코딩 속도 개선
- 프리셋을 한두 단계 빠르게(
medium→fast). - GPU 인코더로 전환(품질 검수 필수).
- 해상도 스케일 다운을 인코더에서 처리(
-vf scale=-2:1080).
배치 처리 자동화
#!/usr/bin/env bash
set -euo pipefail
mkdir -p out
for f in *.mov; do
ffmpeg -y -i "$f" -c:v libx264 -crf 21 -preset medium -pix_fmt yuv420p \
-c:a aac -b:a 160k "out/${f%.mov}.mp4"
done
Windows PowerShell에서는 for 루프·% 확장 문법이 다르므로, 동일 로직을 Get-ChildItem 기준으로 옮기면 됩니다.
흔한 문제와 해결
호환성 이슈
- 프로파일/레벨 불일치: 구형 TV·셋톱박스는 [email protected] 등을 못 받는 경우가 있습니다.
-level 4.1등으로 낮춰 테스트합니다. - 픽셀 포맷: 웹·모바일 최저 호환은 대개 **
yuv420p**입니다.
품질 저하 문제
- 업스케일된 소스를 높은 비트레이트로 다시 인코딩해도 디테일은 돌아오지 않습니다. 원본 해상도·촬영 노출을 먼저 점검합니다.
- 저비트레이트에서 빠른 움직임은 블로킹이 생기기 쉬워 GOP 길이·B-프레임 조정과 함께 비트레이트 자체를 올리는 것이 근본 대응인 경우가 많습니다.
라이선스 고려사항
- H.264는 광범위한 특허가 알려져 있으며, 상용 제품·서비스는 내부 정책·지역·구현 방식에 따라 라이선스 검토가 필요할 수 있습니다. 오픈소스 인코더 사용만으로 모든 권리가 해결되는 것은 아닙니다.
마무리
핵심 요약
- H.264는 호환성·생태계·하드웨어 디코딩 측면에서 여전히 기준 코덱입니다.
- 실무에서는 CRF vs 목표 비트레이트, preset, 프로파일/레벨, yuv420p를 묶어서 생각하면 결과가 안정적입니다.
- HEVC·AV1로 넘어가기 전에, 배포 대상 단말과 법무·라이선스 조건을 먼저 정하는 것이 안전합니다.
추천 사용 시나리오
- 최대 호환 웹·모바일 배포, 라이브 스트리밍(저지연·광범위 단말), 편집 파이프라인의 중간·납품 포맷으로 H.264는 여전히 강력한 선택입니다. 대역폭이 더 중요해지면 HEVC 가이드·AV1 가이드와 함께 비교 결정하세요.