조회 수 28150 추천 수 7 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

코덱에 대한 내용은 무척이나 방대하기 때문에 이 글에서는 비디오 코덱 중 우리가 실질적으로 거의 대부분 쓰게 되는 H.264 계열과 HEVC 계열만을 설명하겠습니다.

 

우선 개념을 분명히 하기 위해 말씀드리자면, 우리가 흔히 HEVC이니 H.264니 하고 부르는 것들은 동영상의 비디오 데이터 스트림의 압축(인코딩) 및 압축 해제(디코딩)에 대한 스펙 기준일 뿐이며, 이를 각각의 기준에 맞게 실제 알고리듬으로 구현한 것들은 또 따로 있다는 것입니다. 그 두 개를 모두 '코덱'이라는 이름으로 같이 부르고 있으니 혼동이 생기는 것인데, 전자를 '코덱 계열(family)', 후자를 '구현된 코덱(implementation)'이라고 생각하면 좀더 분명해질 것 같습니다. ('코덱 계열'은 '코딩 형식(coding format)'이라고도 합니다.)

 

구현된 코덱들은 인코딩 또는 디코딩에만 특화돼 있는 것들이 많습니다. 인코딩에 특화된 구현 코덱은 '인코더(encoder)', 디코딩에 특화된 구현 코덱은 '디코더(decoder)'라고 따로 부르기도 합니다. x264(FFmpeg 내 명칭: libx264), x265(FFmpeg 내 명칭: libx265), aomenc(FFmpeg에서는 libaom-av1aomdec과 함께 들어있음) 등은 인코더, aomdecdav1d(FFmpeg 내 명칭: libdav1d) 같은 것들은 디코더에 해당합니다.

 

코덱 중 H.264, HEVC 계열의 구현 코덱들을 정리한 표는 다음과 같습니다.

 

<H.264, HEVC 계열 코덱들의 종류와 특징>

(구현된 코덱들은 이보다 훨씬 많으나 우리에게 친숙하고 실제 사용할 가능성이 높은 것만 나열했습니다.)

 

이중 CPU를 연산 담당 단위로 하는 것을 소프트웨어 코덱, 그래픽 카드(GPU와 그래픽 카드의 video encoding/decoding engine)를 연산 담당 단위로 하는 것을 하드웨어 코덱이라고 하는데, 인코딩에서만큼은 화질은 소프트웨어 코덱, 속도는 하드웨어 코덱이 훨씬 낫다고 생각하시면 됩니다. 왜냐면 소프트웨어 코덱은 프로그램 업데이트로 알고리듬을 끊임없이 개선해서 더 나은 화질을 구현할 수 있는 데 반해 하드웨어 코덱은 이미 이식된 알고리듬을 빠른 속도로 수행하는 그래픽 카드의 칩들에만 의존하기 때문입니다. 그래서 하드웨어 코덱들은 하드웨어의 한계로 구현하지 못하는 특성들이 있어 일반적으로 소프트웨어 코덱에 비해 화질이 떨어지는 것입니다.

 

H.264와 HEVC에 대해 보다 자세한 내용이 궁금하신 분들은 위키백과나 나무위키를 참조하시기 바랍니다. (영문 위키백과 강추)

 

 

■ 반드시 알아야 할 코덱 관련 용어들

 

○ 비트레이트(bitrate)

  • 압축(인코딩)과 관련해 가장 중요한 특성 중 하나로, 데이터 스트림이 초당 얼마만큼의 비트(bit)인가 하는 것
  • FFmpeg에서는 bps(bits per second) 단위로, x264, x265, 샤나인코더 빠른 설정 등에서는 kbps(kilobits per second) 단위로 측정
  • 고정된 비트수만 가지면 고정 비트레이트(CBR: constant bitrate), 시간마다 다른 비트레이트를 가지면 가변 비트레이트(VBR: variable bitrate)라고 하며, 전체 데이터 스트림의 평균적인 비트레이트는 평균 비트레이트(ABR: average bitrate)라고 함
  • 비트레이트(kbps) x 재생 시간 길이(초) = 용량(kilobits)이므로 용량과 직접적인 연관이 있음

 

○ CRF(constant rate factor)

  • 퀄리티 모드 인코딩에서 퀄리티(우리 눈으로 인식하는 화질)를 결정하는 값
  • 작을수록 퀄리티가 높음
  • 인코더에 따라 매개변수 옵션이 cq(constant quality)라는 이름을 사용하기도 함 (h264_nvenc, hevc_nvenc 등)

 

○ 양자화(quantization)

  • 인코딩 시 손실 압축을 하기 위해 계량화하는 과정
  • 손실 기준을 정하는 매개변수를 퀀타이저(quantizer) 또는 QP(quantization parameter)라고 함
  • 퀀타이저가 작을수록 퀄리티가 높음 (퀀타이저 0은 무손실 압축)

 

※ 인코딩 모드에서 퀀타이저/퀄리티/비트레이트손실 압축에서 원본 데이터의 손실률을 결정하는 기준 (퀄리티나 비트레이트는 퀀타이저를 각각 화질/음질이나 용량에 맞춰 보정한 것)

  • flac 같은 비손실 압축 코덱에서 퀀타이저나 비트레이트를 선택할 수 없는 이유가 여기에 있음
  • 주의 같은 손실률(퀀타이저, 퀄리티나 비트레이트)을 적용해도 원본에 따라 결과가 천차만별임 (원본 정보 파악이 매우 중요한 이유 중 하나)

 

○ 프레임 레이트(frame rate)

  • 1초에 재생되는 프레임(사진) 수
  • 고정된 숫자의 프레임이 재생되면 고정 프레임 레이트(CFR: constant frame rate), 반대의 경우를 가변 프레임 레이트(VFR: variable frame rate)라고 함
  • 가변 프레임 레이트는 비교적 최근에 도입된 것으로, 재생기기와 컨테이너 양식에 따라 지원되지 않을 수 있음

 

○ 인터레이스(interlace)

  • 하나의 프레임을 가로줄 기준으로 홀수별, 짝수별로 따로 두 개로 나눈 것, 각각을 필드(field)라고 함
  • 한 번에 하나의 프레임을 보여주는 프로그레시브(progressive) 방식과 대조되는 개념
  • 과거 CRT 모니터 시절 주사 방식의 특성을 고려하면서 대역폭 절약을 위해 도입된 방식으로, RGB 모니터를 쓰는 현재에는 적합하지 않으나 방송용이나 영상이 담기는 미디어에 따라(DVD, Blu-ray disc) 쓰이는 경우가 있음
  • 인터레이스된 두 개의 필드를 하나의 프레임으로 복원하는 것을 디인터레이싱(deinterlacing)이라고 함

 

○ I 프레임(I-frame, intra-coded frame)

  • 압축/압축 해제를 위해 다른 프레임들을 참조하지 않는 독자적인 프레임

 

○ P 프레임(P-frame, predictive-coded frame)

  • 압축/압축 해제를 위해 일정한 수의 선행 프레임들을 참조하는 프레임
  • 참조하는 프레임과의 움직임 차이만이 기록
  • 미디어인포에서 보여주는 H.264의 'Ref Frames' 정보가 이 P 프레임이 참조하는 선행 프레임들의 갯수

 

○ B 프레임(B-frame, bipredictive-coded frame)

  • 압축/압축 해제를 위해 일정한 수의 앞과 뒤 프레임들을 참조하는 프레임
  • P 프레임처럼 참조하는 프레임과의 움직임 차이만이 기록

 

○ GOP(group of pictures)

  • 하나의 I 프레임과 이에 연관되는 다른 프레임들의 묶음

닫힌 GOP(closed GOP): GOP 내의 프레임들이 다른 GOP의 프레임들을 참조하지 못하는 GOP (닫힌 GOP의 I 프레임을 '키프레임(또는 IDR 프레임)'이라고 함)

열린 GOP(open GOP): GOP 내의 프레임들이 다른 GOP(대개 선행 GOP) 내의 프레임들을 참조하는 GOP (압축 효율이 증가하는 대신 인코딩/디코딩 시의 복잡도 증가)

  • H.264의 경우 닫힌 GOP가 기본값이며, HEVC의 경우 열린 GOP가 기본값 (HEVC의 모든 GOP가 열려 있다는 의미는 아니고, 열린 GOP를 허용한다는 의미)
  • H.264의 경우 설정된 연속된 B 프레임 수가 2고 GOP 크기가 12라면 (M=3, N=12), IBBPBBPBBPBP(또는 B)와 같이 프레임들이 구성
  • H.264 계열과 HEVC 계열의 코덱들은 인코더가 GOP 크기 또는 키프레임의 간격을 원본에 따라 탄력적으로 결정할 수 있음(min-keyint, keyint 옵션)

 

○ 프로파일(profile)

  • 코덱이 갖춰야 할 특성들 모음
  • 효율(압축률)과 관련이 있으며, 효율이 좋은 프로파일일수록 연산이 오래 걸림
  • 일종의 '압축과 관련된 특성들의 제약(features constraint)'이므로, 인코딩 당시의 한계 상황(실시간 인코딩, CPU의 한계)이나 디코딩을 하게 될 재생기기가 지원하지 않는 특성들을 고려해야 할 경우를 제외하고는 인코딩할 때 설정하지 않아도 무방
  • 인코더 특정 고유 옵션의 설정값을 변경하는 방식으로 제약을 가함

 

○ 레벨(level)

  • 해상도, 프레임 레이트, 최대 비트레이트 등 영상의 대역폭(bandwidth) 설정
  • 이 역시 일종의 한계값이므로 재생기기의 한계(버퍼 크기, 최대 비트레이트 등 대역폭 관련 한계)나 스트리밍 시 대역폭의 한계가 있는 상황이 아니라면 굳이 따로 설정할 필요 없음

 

○ 프리셋(preset)

  • 인코딩 시 인코더가 사용하게 될 인코더 고유 설정값들을 미리 묶어둔 것
  • 코덱의 압축률을 결정하는 기준
  • 대부분의 코덱에서 높은 압축률(효율)을 목표로 할수록 낮은 속도가 나오기 때문에 대부분 속도로 표시
  • 압축률이 높다 = (비손실 압축 코덱이나 퀄리티 모드에서는) 용량이 줄어든다 = (비트레이트 모드에서는) 화질/음질이 나아진다
  • 주의 인코딩은 기본적으로 원본의 상태가 가장 결정적인 요소가 되므로 프리셋의 압축 효율이란 것도 "평균적으로 그렇다"는 것이지 모든 원본에 대해 항상 해당하는 건 아님 (원본에 따라 어떤 원본은 fast가 medium보다 화질이 좋아 보일 수도 있음)
  • 인코딩 시 반드시 설정해야 함 (ffmpeg에서는 설정하지 않을 경우 medium으로 자동적으로 설정됨)
  • 사용자가 인코더 고유 설정으로 따로 설정한 값들은 프리셋의 설정값보다 우선

 

○ 튠(tune)

  • 원본의 특성에 맞게 인코더의 몇몇 고유 설정값들을 사전 설정한 것
  • 프리셋보다 우선 순위가 높으나 사용자 설정보다는 떨어짐
  • 이 역시 일종의 추가 옵션이므로 특별한 목적이 아닌 한 인코딩 시 따로 설정할 필요 없음
이 글을 추천한 사람
시밤탱 편집배우기 II bluedove 로메로 대붕
Facebook Twitter Pinterest Kakao
  • ?
    papa 2020.02.19 14:05
    와 넘 감사합니다 궁금증이 확 해소되었어요
  • ?
    Prosecol 2022.12.06 13:00

    감사합니다. 단지 영상 크기 줄이고 싶어서 공부하는 완전 초짜인데, 이렇게 유용한 정보가 정리된 글을 한글로 볼 수 있다는게 지금까지 영어 사이트 보느라 막막했던게 다 풀리는 기분이에요. 정말 많이 알아갑니다. 다시 한번 감사합니다!


List of Articles
번호 제목 글쓴이 날짜 조회 수 추천 수
53 HEVC 코덱 설정->튜닝 옵션별 각 화질 비교 4 file 바봉이 2020.02.05 18486 0
52 H264(AMF), HEVC(AMF) 옵션 도움말 1 JKyle 2020.02.03 9215 0
51 H264(NVENC), HEVC(NVENC) 옵션 도움말 1 JKyle 2020.02.03 11454 0
50 필터 적용 사례: 로고/워터마크 제거 1 JKyle 2020.01.31 8881 2
49 HDR 영상과 10비트 영상 3 JKyle 2020.01.29 14548 3
48 색공간과 Bit Depth 4 JKyle 2020.01.28 7816 2
47 샤나인코더 영상 사이즈 변경 옵션을 통한 FFmpeg 필터의 기초 이해 4 JKyle 2020.01.27 11529 3
46 샤나인코더의 H264 설정과 FFmpeg의 x264 설정 이해 8 JKyle 2020.01.27 27653 2
45 FFmpeg 명령어 구조와 샤나인코더 작동 방식 이해 JKyle 2020.01.26 5466 2
44 [인포그래픽] 인코딩 작업 흐름과 자막 작업 1 JKyle 2020.01.25 3383 0
43 [인포그래픽] 인코딩 작업의 흐름도 1 JKyle 2020.01.25 6344 2
» [필독] 비디오 코덱과 기본 용어 (H.264, HEVC) 2 JKyle 2020.01.25 28150 7
41 샤나인코더로 움짤 만들기 4 file JKyle 2019.09.08 7533 0
40 기록 보기에서 Consider increasing the value for the 'analyzeduration' and 'probesize' options 내용이 있을 때 해결법 4 Rina 2019.09.04 4188 1
39 SRT SMI 자막 인코딩 이용시 한글 깨짐 자막변환 방법 file 나그네3 2019.03.14 30211 1
38 webm VP9 멀티스레드 활성화하는 방법, 속도 향상시키는 방법 마소리스 2018.09.25 6427 0
37 "비트레이트를 원본보다 높게 주면 원본보다 퀄리티가 나아질 수 있다"는 주장에 대해 6 JKyle 2018.09.19 18880 0
36 SSIM, PSNR로 측정한 NVENC 인코딩 4 file JKyle 2018.09.09 4182 0
35 인코딩된 파일의 PSNR, SSIM 값 계산하기 file JKyle 2018.09.05 3552 1
34 8비트 원본을 10비트로 인코딩하면 8비트로 인코딩할 때보다 화질이 더 낫다? 5 JKyle 2018.09.04 8759 0
Board Pagination Prev 1 2 3 4 Next
/ 4