FFMPEG/FFMPEG 기초

코덱이란 무엇인가?

JasonCloud 2020. 6. 30. 22:19
반응형

음성 또는 영상의 신호를 디지털 신호로 변환하는 코더와 그 반대로 변환시켜 주는 디코더의 기능을 함께 갖춘 기술.

코더(coder)와 디코더(decoder), 또는 컴프레서(Compressor)와 디컴프레서(Decompressor)의 합성어로, 음성이나 비디오 데이터컴퓨터가 처리할 수 있게 디지털로 바꿔 주고, 그 데이터를 컴퓨터 사용자가 알 수 있게 모니터에 본래대로 재생시켜 주기도 하는 소프트웨어이다. 동영상처럼 용량이 큰 파일을 작게 묶어주고 이를 다시 본래대로 재생할 수 있게 해준다. 파일을 작게 해주는 것을 인코딩(encoding), 본래대로 재생하는 것을 디코딩(decoding)이라고 한다. 또 데이터 압축 기능을 사용하여 압축하거나 압축을 푸는 소프트웨어도 코덱에 포함된다.

코덱의 종류는 매우 다양하다. 동영상 코덱으로는 가장 많이 사용되는 MPEG(MPEG1, MPEG2, MPEG4)을 비롯하여 인텔의 Indeo, DivX, Xvid, H.264, WMV, RM, Cinepak, MOV, ASF, RA, XDM, RLE 등이 있다. 오디오 코덱으로는 가장 잘 알려진 MP3를 비롯하여 AC3, AAC, OGG, WMA, FLAC. DTS 등이 있다. 압축 소프트웨어로는 알집, 반디집, FilZip, 7-Zip, WinRAR, WinZip 등이 있다. 이들 각 코덱은 표준화가 이루어지지 않아서 압축방법이나 화질, 압축률 등이 서로 다르고 호환성이 없기 때문에 필요한 코덱을 개별적으로 설치하여야 한다. 이러한 번거로움을 피하기 위하여 여러 종류의 코덱을 한꺼번에 설치해주는 것을 통합코덱이라 한다.

 

출처  : [네이버 지식백과] 코덱 [Codec] (두산백과)

 

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

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

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

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

 

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

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

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

○ 비트레이트(bitrate)

압축(인코딩)과 관련해 가장 중요한 특성 중 하나로, 데이터 스트림이 초당 얼마만큼의 비트(bit)인가 하는 것

고정된 비트수만 가지면 고정 비트레이트(CBR: constant bitrate), 시간마다 다른 비트레이트를 가지면 가변 비트레이트(VBR: variable bitrate)라고 하며, 전체 데이터 스트림의 평균적인 비트레이트는 평균 비트레이트(ABR: average bitrate)라고 함

비트레이트 x 재생 시간 길이 = 용량이므로 용량과 직접적인 연관이 있음

○ CRF(constant rate factor)

퀄리티 모드 인코딩에서 퀄리티(우리 눈으로 인식하는 화질)를 결정하는 값

작을수록 퀄리티가 높음

FFmpeg의 하드웨어 인코더에서는 완전히 독립적인 퀄리티 모드 인코딩이 불가능하며, 대신 비트레이트 모드에 추가적인 옵션을 적용하여 이를 흉내내고 있는 수준임

rigaya의 NVEnc에서는 "--vbrhq 0 --vbr-quality <float>" 옵션을 통해 소프트웨어 인코더의 crf 모드를 어느 정도 구현하고 있음

○ 양자화(quantization)

인코딩 시 손실 압축을 하기 위해 계량화하는 과정

손실 기준을 정하는 매개변수를 퀀타이저(quantizer) 또는 QP(quantization parameter)라고 함

퀀타이저가 작을수록 퀄리티가 높음 (퀀타이저 0은 무손실 압축)

○ 프레임 레이트(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)

인코딩 시 인코더가 사용하게 될 몇 가지 중요한 인코더 고유 설정값들을 미리 묶어둔 것

인코딩 시 반드시 설정해야 함 (ffmpeg에서는 설정하지 않을 경우 medium으로 자동적으로 설정됨)

사용자가 인코더 고유 설정으로 따로 설정한 값들은 프리셋의 설정값보다 우선

○ 튠(tune)

원본의 특성에 맞게 인코더의 몇몇 고유 설정값들을 사전 설정한 것

프리셋보다 우선 순위가 높으나 사용자 설정보다는 떨어짐

이 역시 일종의 추가 옵션이므로 특별한 목적이 아닌 한 인코딩 시 따로 설정할 필요 없음

 

출처: 

블로그

늑대와여우컴퓨터 신원당대리점 (고양시 성사동)

https://wolffox2822.modoo.at/

반응형