x264 실전 옵션 — ref, tune, keyint 완전 가이드
OBS/FFmpeg 설정 화면에서 만나는 x264 옵션을 하나씩 해부. ref=1 vs ref=4, tune=zerolatency가 내부에서 끄는 6가지 옵션, profile=main+bframes=0 조합의 이유, '키프레임 2초'가 업계 표준인 5가지 근거(HLS 세그먼트·채널 조인 대기·PLI 복구·대역폭·업계 관행), 30fps→keyint=60 / 60fps→120 환산까지.
목차(18개 항목)
1. ref — reference frames (참조 프레임 수)
2. tune — 용도별 프리셋
3. profile — 호환성 vs 기능
4. 키프레임 간격 — "왜 진짜 2초"인지
5. 한 줄 정리
- 6. 트레이드오프 시각화 — 실시간 vs VOD
- 관련 글
28편에서는 Profile과 비트레이트, 29편에서는 B-frame 자체를 다뤘습니다. 이 글은 실제 OBS/FFmpeg 설정 화면에서 만나게 되는 x264 옵션들을 하나씩 해부합니다: ref, tune, profile, keyint. 실시간 송출과 VOD가 왜 다른 값을 쓰는지, 그리고 '키프레임 2초'가 왜 업계 표준인지의 근거.
1. ref — reference frames (참조 프레임 수)
개념
P-frame이 "이전 프레임을 참조한다"고 했죠? 이때 몇 개까지 과거 프레임을 참조할지 정하는 옵션입니다. ref=1이면 직전 프레임 하나만, ref=4면 최대 4개까지 후보로 두고 인코더가 가장 압축 효율이 좋은 참조 조합을 골라 씁니다.
왜 실시간에서 ref=1?
- 디코더 메모리 사용량 ↓ — 과거 프레임 1개만 보관하면 되므로 저사양 기기에서도 안정적으로 동작합니다.
- 손실 복구 체인 단순화 — 패킷 하나가 유실됐을 때, ref=1이면 그 프레임 하나만 재요청(PLI)하면 이후 체인이 복구됩니다. ref=4면 4개의 참조가 얽혀 있어 하나 손실이 연쇄 손상으로 번질 가능성이 큽니다.
- 인코더 연산 ↓ — 후보 참조 프레임이 하나이므로 탐색 연산이 최소입니다.
- 압축률은 약간 손해지만 실시간에서는 지연/안정성이 우선입니다.
ref 값 선택 가이드
| ref 값 | 용도 | 이유 |
|---|---|---|
1 | WebRTC, 실시간 화상회의, 게임 스트리밍 | 디코더 부담 최소, 손실 복구 단순 |
2~3 | RTMP 라이브 방송, OBS 스트리밍 | 압축 효율과 지연의 균형점 |
4~6 | VOD 인코딩, Blu-ray, 녹화 배포 | 최대 압축 효율 (지연 제약 없음) |
2. tune — 용도별 프리셋
튠(tune)은 특정 용도에 맞춰 x264 내부 파라미터 세트를 한 번에 조정하는 프리셋입니다. x264엔 수십 개의 세부 옵션이 있어 수동으로 모두 맞추기가 복잡합니다. tune 하나로 주요 파라미터 묶음을 한 번에 최적화합니다.
| 튠 | 용도 |
|---|---|
film | 영화용, 고화질 VOD |
animation | 애니메이션 (단색 영역 많음) |
grain | 노이즈 보존 (필름 질감) |
stillimage | 정지 이미지에 가까운 영상 |
fastdecode | 디코딩 부담 최소화 (저사양 기기) |
zerolatency | 지연 최소화 (실시간 스트리밍/화상회의) |
zerolatency가 내부적으로 하는 일
핵심은 **"미래 프레임 미리 보지 말고 현재 프레임만 즉시 처리"**입니다. B-frame도 자동으로 꺼집니다. → 왜 B-frame이 지연의 원인인지는 B-frame 완전정복 참조.
실무 팁:
tune=zerolatency하나만 줘도bframes=0효과가 이미 포함됩니다. 명시적으로 둘 다 쓰면 더 확실할 뿐입니다.
tune 적용 FFmpeg 예시
3. profile — 호환성 vs 기능
이전 글에서 다뤘듯이 H.264 프로파일 선택입니다. 자세한 분석은 H.264 Profile·인코더 옵션 참조. 이 글에서는 x264 옵션 맥락에서의 실무 정리만 다룹니다.
| 프로파일 | 특징 | Agora/WebRTC |
|---|---|---|
baseline | 가장 호환성 높음, 기능 제한 | ✅ 안전 |
main | B-frame, CABAC 허용 | ✅ bframes=0이면 안전 |
high | 모든 기능 (4K/Blu-ray용) | ✅ Agora 수용 (bframes=0 전제 권장) |
profile=main + bframes=0 조합은 Main Profile의 CABAC 효율은 쓰되 B-frame만 끄는 구조입니다. WebRTC 호환성과 압축률의 균형점이 여기에 있습니다.
profile 선택 매트릭스
4. 키프레임 간격 — "왜 진짜 2초"인지
가장 자주 질문받는 값입니다. "2초"가 어디서 온 숫자인지 근거를 짚습니다.
개념
키프레임 간격 = GOP 길이 = I-frame 사이 시간. GOP 개념 자체는 프레임의 모든 것 §GOP 참조.
x264 파라미터 이름: keyint (또는 --keyint). 단위는 프레임 수. 60fps에서 keyint=120이면 2초 간격.
2초가 표준인 5가지 이유
1. HLS/DASH 세그먼트 단위와 일치
HLS는 보통 2~6초 세그먼트로 영상을 쪼갭니다. 각 세그먼트는 I-frame으로 시작해야 합니다 (독립 재생 가능해야 하니까). 2초 키프레임 간격이면 2/4/6초 세그먼트 모두 호환됩니다.
2. 채널 조인 대기 시간
새 시청자가 합류하면 다음 I-frame까지 대기해야 합니다 — 그 전에는 화면을 그릴 수 없습니다. 사용자가 참을 수 있는 대기 시간이 ~2초입니다. 10초면 "왜 안 뜨지?" 느낌이 강해집니다.
3. 패킷 손실 복구 최악 시나리오
PLI 요청 없이 자연 복구를 기다릴 때 최대 대기 = 키프레임 간격. 2초면 최악에도 2초 안에 복구됩니다.
4. 대역폭 오버헤드 적정
I-frame이 P-frame의 510배. 1초 간격 vs 2초 간격 → 전체 대역폭 1520% 차이. 2초 이상 늘려도 절감 효과가 급격히 감소합니다.
5. 업계 관행
YouTube Live, Twitch, Facebook Live 모두 2초 권장. WebRTC 구현체 기본값. Agora도 이 근처 권장.
프레임 수로 환산
| fps | keyint (2초 기준) |
|---|---|
| 30 | 60 |
| 60 | 120 |
OBS에서 "키프레임 간격 2"라고 입력하면 OBS가 현재 fps를 보고 자동 계산합니다. FFmpeg 직접 설정 시엔 -x264-params keyint=60 식으로 프레임 수를 씁니다.
keyint vs min-keyint
x264엔 두 가지 keyint 옵션이 있습니다.
scenecut이 살아있으면 장면 전환 시 추가 I-frame이 삽입됩니다. 라이브에선 이게 예측 불가 오버헤드가 될 수 있어, scenecut=0으로 꺼두는 설정도 자주 씁니다.
5. 한 줄 정리
| 옵션 | 실시간 값 | VOD 값 | 이유 |
|---|---|---|---|
ref | 1 | 3~4 | 디코더 메모리, 손실 복구 단순성 |
tune | zerolatency | film | 미래 프레임 look-ahead 제거 vs 최대 압축 |
profile | main + bframes=0 | high | WebRTC 호환 + 압축 균형 vs 최대 효율 |
keyint | 60 (30fps) / 120 (60fps) | 240+ | HLS 세그먼트, 채널 조인 대기, 손실 복구 상한 |
조합 예시 — 실전 설정
6. 트레이드오프 시각화 — 실시간 vs VOD
실시간과 VOD 설정의 차이를 한 번에 보면 이렇습니다.