x264 설정창을 기준으로 각각의 옵션들을 정리해 보겠습니다.
먼저 옵션 설명에 필요한 x264의 압축 과정을 간단히 요약하면 다음과 같습니다.
1) IDR프레임,I프레임,P프레임,B프레임 중 어떤 종류의 프레임으로 압축할지를 결정합니다.
프레임의 종류가 결정되면 각각의 프레임은 다시 매크로블럭(Macroblock)이라는 16x16 크기의
작은 블럭으로 나눠지는데 이 매크로블럭을 압축하는 방식에는 크게 Intra코딩과 Inter코딩이 있습니다.
IDR, I프레임은 프레임 내의 모든 매크로블럭이 Intra코딩되는 프레임 이고,
P프레임 내의 매크로블럭은 Intra코딩과 Inter코딩(전방향)의 두가지 방식이 모두 가능합니다.
B프레임 내의 매크로블럭도 Intra코딩과 Inter코딩(전방향, 후방향, 양방향)의 두가지 방식이 가능합니다.
1-1) Inter코딩은 움직임예측(Motion Estimation)을 사용하는 압축방식입니다.
이미 압축돼있는 프레임을 참조하여 현재 압축하려는 블럭을 예측(Inter Prediction)하고
예측된 블럭과 실제 블럭의 차이값인 예측오류데이터(Residual Data)를 계산합니다.
이 때, 예측에 사용된 부분이 참조프레임의 어디에 있는지를 나타내는 움직임벡터(Motion Vector)도
구해야 하는데 여기에서도 예측이 사용됩니다.
H.264/AVC 표준 상에 정의된 여러가지 방법으로 PMV(Predicted Motion Vector) 즉, 예측된 움직임벡터를 산출합니다.
이렇게 산출된 PMV와 움직임예측으로 구해진 실제 움직임벡터와의 차이값(MVD : Motion Vector Difference)을 구합니다.
1-2) Intra코딩은 움직임예측을 사용하지않는 압축방식입니다.
움직임벡터가 필요한 프레임 간 예측(Inter Prediction)을 샤용하지 않는 대신, 인접한 주변 블럭들의
픽셀값을 직접 사용해서 현재 압축하려는 블럭을 예측하는 프레임 내 예측(Intra Prediction)을 사용합니다.
Inter코딩과 마찬가지로 예측된 블럭과 실제 블럭의 차이값인 예측오류데이터를 구하는게 목적입니다.
2) 1번 과정에서 구해진 예측오류데이터를 압축하기 위해서 먼저 주파수변환을 수행합니다.
주파수변환은 픽셀 영역의 예측오류데이터를 주파수 영역의 계수들로 변환하는 과정을 말합니다.
주파수변환을 통해 예측오류데이터를 주파수 계수들로 분리함으로써 이후의 양자화 과정에서 효율적인 압축이 가능합니다.
H.264/AVC 표준은 이전의 표준에서 사용되었던 8x8 DCT대신에 DCT를 약간 수정한 4x4 정수변환을 사용합니다.
High Profile 이상에서는 4x4 정수변환과 8x8 정수변환을 선택적으로 사용할 수 있습니다.
3) 2번 과정에서 구해진 주파수 계수들을 양자화(Quantization)합니다.
불필요하거나 덜 중요하다고 판단되는 주파수 계수들을 줄이거나 제거함으로써 압축을 수행합니다.
이 과정에서 줄어들거나 제거된 주파수 계수들은 디코딩 과정에서 정확한 복원이 불가능하기 때문에
실질적으로 데이터의 손실이 발생하는 과정입니다.
4) 양자화된 계수들은 다시 한 번 압축되는데 이 과정을 엔트로피 코딩이라고 합니다.
엔트로피 코딩은 확률적인 방법을 사용해서 데이터의 크기를 줄이는 무손실 압축방식입니다.
H.264/AVC 표준에서는 Exp-Golomb, CAVLC, CABAC 등의 방식이 사용되는데 양자화된 예측오류데이터에는
CAVLC와 CABAC이 선택적으로 사용됩니다. (CABAC은 Main Profile 이상에서만 사용이 가능합니다.)
다음으로 MeGUI 의 설정창에 표시되는 x264 옵션들에 대한 정리입니다.
Main
Encoding Mode
인코딩 모드를 결정하는 부분으로 비트레이트를 배분하는 방법에 따라서 여러가지로 나뉩니다.
- ABR : 1패스 평균비트레이트 모드입니다. 정해진 비트레이트를 크게 벗어나지 않는 범위 내에서 비트를 배분합니다.
영상의 전반적인 모습을 알지 못하는 상태에서 정해진 비트레이트에 맞게 비트를 배분해야하기 때문에
비트 배분에 있어서는 약간 효율이 떨어지는 방식입니다.
어느정도의 비트레이트를 맞춰야하는 동시에 2패스 모드를 사용하기엔 시간이 부족한 경우라면 ABR모드가 적당합니다.
비트레이트 단위는 kbit/s입니다.
- Const. Quantizer : 고정 양자화 모드입니다. 보통 CQP 모드라고 합니다.
고정된 양자화 수치(QP : Quantization Parameter)로 압축을 수행합니다.
QP값은 3)번 과정에서 어느정도로 계수들을 양자화할지 결정하는 수치인데 값이 클수록 비트레이트는 낮아집니다.
비트레이트를 특정해서 인코딩하는 ABR이나 멀티패스 모드에서는 정해진 비트레이트를 맞추기 위해서 QP값을 유동적으로
조절하면서 압축을 수행하지만 고정 양자화 모드에서는 QP값이 일정하기 때문에 "비트 배분 조절"이라는 개념이 없습니다.
따라서 인코딩된 영상의 비트레이트가 어떻게 될지는 인코딩이 끝날 때까지 예측할 수가 없습니다.
QP값이 고정돼있기 때문에 화면이 복잡하고 움직임이 많으면 비트레이트가 높아지고, 반대로 화면이 단순하고 움직임이
적으면 비트레이트가 낮아집니다. 비트레이트를 예측할 수는 없지만 영상 전체적으로 비슷한 화질을 보여줍니다.
0부터 51까지의 값이 사용 가능하고 20 ~ 25 사이의 값이 주로 사용됩니다.
- Const. Quality : 고정 레이트 팩터(CRF : Constant Rate Factor) 모드입니다. 보통 CRF 모드라고 합니다.
화면의 복잡성을 고려해서 고정된 CRF수치로 비트를 배분하는데, 이 때 사용되는 배분 방식이 멀티패스 모드와 동일하기 때문에
비트 배분의 효율성에 있어서는 멀티패스 모드와 거의 같다고 할 수 있습니다.
단, CRF 모드 역시 정해진 비트레이트 없이 고정된 CRF 수치를 기준으로 비트를 배분하는 방식이기 때문에 인코딩된 영상의
비트레이트를 사전에 예측할 수 없습니다. 이런 면에서는 CQP 모드와 비슷하지만 비트 배분에 있어서 CQP 모드보다
더 효율적이기 때문에 특별한 경우가 아니라면 CRF 모드를 사용하는 편이 화질면에서 유리합니다.
마찬가지로 0부터 51까지의 값이 사용 가능하고 20 ~ 25 사이의 값이 주로 사용됩니다.
- Automated 2pass : 2패스 평균비트레이트 모드입니다. 총 2번의 인코딩 과정이 수행됩니다.
첫 번째 패스에서는 프레임 종류, 각각의 장면에서 필요한 비트량 등을 분석해서 .stats파일에 기록합니다.
(MB-Tree를 사용하는 경우에는 MB-Tree에 필요한 정보를 기록하기 위해 .mbtree파일이 추가로 만들어집니다.)
두번쨰 패스에서는 첫 번째 패스에서 만들어진 .stats파일을 참고해서 실제 인코딩을 수행합니다.
실제로 영상이 만들어지는 두 번째 패스에서는 .stats파일을 통해서 영상의 전반적인 모습을 알 수 있기 때문에
정해진 비트레이트를 정확하게 맞춰주면서 동시에 효율적인 비트 배분이 가능합니다.
비트레이트 단위는 kbit/s입니다.
- Automated 3pass : 3패스 평균비트레이트 모드입니다. 총 3번의 인코딩 과정이 수행됩니다.
기본적으로 2패스 평균비트레이트 모드와 같은 방식입니다. 첫 번째 패스에서 .stats파일을 만들어 내고 두 번째 패스에서는
이미 만들어진 .stats파일을 갱신합니다. 마지막으로 세 번째 패스에서 갱신된 .stats파일을 참고해서 인코딩을 수행합니다.
두 번째 패스에서 .stats파일을 한 번 더 업데이트하기 때문에 좀 더 정확한 .stats파일을 사용할 수 있다는 장점이 있지만
그로 인한 이익은 아주 미미한 수준입니다. 인코딩 시간 대비 효율이 낮아서 거의 사용되지 않는 방식입니다.
비트레이트 단위는 kbit/s입니다.
- Lossless : 무손실 압축 모드입니다. CQP 모드나 CRF 모드에서 값을 0으로 지정하면 무손실 압축을 수행합니다.
x264의 압축과정 중에서 데이터의 손실이 발생하는 부분인 3)번 양자화 과정을 거치지 않는 방식입니다.
3)번 과정을 거치지 않기 때문에 2)번 과정도 생략되고, 1)번 과정에서 바로 4)번 과정으로 진행합니다.
즉, 예측을 통해 구해진 예측오류데이터를 곧바로 엔트로피 코딩함으로써 무손실 압축이 가능하게 합니다.
단, 무손실인 만큼 대부분의 경우 비트레이트가 굉장히 높아집니다.
또한 무손실 압축은 H.264/AVC 표준의 High 4:4:4 Predictive Profile에서만 사용 가능한 방식입니다.
따라서 x264의 Lossless 모드로 인코딩된 파일은 High 4:4:4 Predictive Profile에 해당합니다.
프로파일의 이름처럼 H.264/AVC 표준에서는 Lossless 모드에서도 P, B프레임을 모두 사용 가능하도록 정하고 있지만
x264 개발자들은 Lossless 모드에서 B프레임이 효율적이지 않다는 판단하에 P프레임만 사용하도록 하고 있습니다.
Presets
프리셋은 이용자의 편의를 위해 x264의 여러 옵션값들을 미리 설정해 놓은 메뉴라고 할 수 있습니다.
프리셋의 이름에서 알 수 있듯이 인코딩 속도를 기준으로 여러가지 프리셋이 마련되어 있습니다.
빠른 프리셋은 그만큼 압축 효율은 낮아지고 느린 프리셋은 압축 효율이 높습니다.
먼저 적당한 프리셋을 선택한 후에 추가적으로 조절할 옵션들이 있다면 설정창에서 직접 조절하는 방식으로 사용하면 좋습니다.
Tunings
튜닝 또한 이용자의 편의를 위해 x264의 여러 옵션값들을 미리 설정해 놓은 메뉴입니다.
튜닝의 이름에서 알 수 있듯이 인코딩하려는 소스나 목적에 따라서 여러가지 튜닝값이 마련되어 있습니다.
먼저 적당한 튜닝값을 선택한 후에 추가적으로 조절할 옵션들이 있다면 설정창에서 직접 조절하는 방식으로 사용하면 좋습니다.
H.264 Features
- Deblocking : H.264/AVC 표준의 In-loop Deblocking 필터와 관련된 옵션입니다. In-loop Deblocking 필터는 1-1)번 과정에서
참조프레임에 Deblocking 필터를 적용함으로써 좀 더 효율적인 움직임 에측이 가능하게 합니다.
참조프레임은 이미 압축된 프레임이기 떄문에 블럭화 현상이 나타나는 경우가 많은데 이런 블럭화 현상을 줄여줌으로써
Inter코딩시 에측오류데이터를 줄일 수 있습니다.
Strength는 Deblocking 필터의 강도를 결정합니다. 낮은 값일수록 필터의 강도가 약해집니다.
Threshold는 얼마나 많은 블럭에 Deblocking 필터를 적용할지를 결정합니다.
낮은 값일수록 더 많은 블럭에, 더 낮은 강도의 Deblocking 필터가 적용됩니다.
각각 0이 기본값이고 -3 ~ 3 사이의 값이 주로 사용됩니다.
- CABAC : Context-Adaptive Binary Arithmetic Coding의 약자입니다.
4)번 과정에서 엔트로피 코딩에 사용되는 방식 중 가장 효율적인 압축 방식입니다.
CABAC을 사용하지 않으면 CAVLC(Context-Adaptive Variable Length Coding)이 대신 사용됩니다.
CAVLC보다 CABAC의 압축 효율이 더 높기 때문에 특별한 이유가 없다면 사용하는 편이 좋습니다.
다만 압축 효율이 높은 만큼 훨씬 복잡한 방식이기 때문에 인코딩, 디코딩 모두 부하가 커집니다.
Main Profile이상에서만 사용 가능합니다.
Quantizers
주파수변환된 계수들을 얼마나 양자화할 것인지 결정하는 수치인 QP값에 관련된 옵션들입니다.
- Min/Max/Delta : 프레임당 양자화 수치(QP)의 최소값, 최대값 그리고 연속한 프레임 간에 증가하거나
감소하는 QP값의 최대치를 조절하는 옵션입니다.
기본값은 각각 0, 69, 4이고 특별한 이유가 없다면 기본값을 사용하는 편이 좋습니다.
- Qunatizers Ratio (I:P / P:B) : I:P 수치는 P프레임을 기준으로 I프레임의 QP값을 산출할 때 사용되는 가중치입니다.
P:B 수치는 P프레임을 기준으로 B프레임의 QP값을 산출할 때 사용되는 가중치입니다.
P:B 수치는 MB-Tree옵션과 함께 사용되면, 지정된 값이 무시되고 MB-Tree에 의해서 자동으로 조절됩니다.
각각 기본값은 1.4, 1.3입니다. 특별한 이유가 없다면 기본값을 사용하는 편이 좋습니다.
- Deadzones (Inter / Intra) : 3)번 과정에서 사용되는 양자화 방식의 하나입니다.
x264는 양자화 방식으로 Deadzones과 Trellis 중 하나를 선택할 수 있습니다.
이 옵션은 Deadzones을 사용하는 경우에 적용되는 수치이고 기본값은 21, 11입니다.
각각 0 ~ 32 사이의 값이 사용 가능하고 값을 낮출수록 미세한 디테일이나 필름 그레인 유지에 효과가 있습니다.
x264는 Trellis를 기본적으로 사용하기 때문에 Deadzones을 사용하려면 Trellis를 사용하지 않아야 합니다.
- Chroma QP Offset : H.264/AVC 표준에서는 Chroma블럭의 QP값은 따로 계산되지 않고 Luma블럭의 QP값에 따라서
자동으로 산출되는데, Chroma블럭의 QP값을 산출할 때 사용되는 가중치입니다.
-12 ~ 12 사이의 값이 사용 가능하고 기본값은 0입니다. 특별한 이유가 없다면 기본값을 사용하는 편이 좋습니다.
Psy-RD, Psy-Trellis 옵션이 사용되면 각각의 수치에 따라서 자동으로 값이 조절됩니다.
- Credits Quantizer : MeGUI에서 자체적으로 지원하는 옵션입니다.
MeGUI의 Video Preview 창에서 Intro 버튼과 Credits 버튼으로 Intro / Credits 구간을 지정해 주면 해당 구간을
x264의 Zones 옵션을 사용해서 고정된 QP값으로 인코딩하는데, 이 때 사용되는 QP값을 결정하는 옵션입니다.
영화의 초반부나 후반부처럼 자막만으로 구성되는 구간은 비트가 많이 필요하지 않기 때문에 이 옵션을 사용해서
해당 구간의 QP값을 높여줌으로써 비트를 절약할 수 있습니다. 기본값은 40입니다.
Rate Control
- VBV Buffer Size : 비디오 버퍼 검증기(VBV)의 버퍼 사이즈를 결정하는 옵션입니다.
- VBV Maximum Bitrate : VBV의 버퍼에 입력되는 최대 비트레이트를 결정하는 옵션입니다.
VBV(Video Buffer Verifier)는 비디오 버퍼의 크기가 제한되어 있는 하드웨어 재생을 위한 동영상을 만들거나
스트리밍처럼 전송용 동영상을 만드는 경우에 주로 사용되는 기능입니다. 기본값은 각각 0, 0으로 사용되지 않습니다.
각종 휴대기기나 하드웨어 재생기에서 재생할 목적으로 인코딩하는 경우에는 VBV를 사용하는 편이 좋습니다.
- VBV Initial Buffer : VBV의 버퍼에 데이터가 어느정도 채워졌을 때 재생을 시작할지 결정하는 옵션입니다.
0 ~ 1 사이의 값이 사용 가능하고 기본값은 0.9입니다. VBV가 사용되지 않으면 이 옵션도 무시됩니다.
- Bitrate Variance : 1패스 평균비트레이트 모드에서 주로 사용되는 옵션입니다.
정해진 평균비트레이트를 얼마나 정확하게 맞춰줄지를 결정하는 옵션입니다.
1패스 평균비트레이트 모드의 목적은 정해진 비트레이트에서 크게 벗어나지 않는 동시에 효율적으로 비트를 배분하는 것인데
이 옵션값을 높일수록 비트 배분을 효율적으로 하는 대신 정해진 비트레이트에서 벗어나는 정도가 커집니다.
기본값은 1.0이고 특별한 이유가 없다면 기본값을 사용하는 편이 좋습니다.
- Quantizer Compression : 화면의 복잡도에 따라서 비트레이트 배분의 가중치를 결정하는 옵션입니다.
옵션값을 높일수록 영상 내의 복잡하거나 움직임이 많은 부분에서 비트레이트를 높여 줍니다.
0 ~ 1 사이의 값이 사용 가능하고 기본값은 0.6입니다.
MB-Tree와 함께 사용되면 MB-Tree의 강도를 조절해 줍니다. 값이 높을수록 MB-Tree의 강도는 낮아집니다.
- Temp. Blur of est. Frame complexity : x264는 비트레이트를 배분할 때, 먼저 영상의 복잡하거나 단순한 정도에 따라서
복잡도(Complexity)가 계산되고 이 복잡도에 따라서 비트를 배분하게 됩니다.
이 옵션은 계산된 복잡도의 편차를 줄여줌으로써 프레임 간의 과도한 비트레이트 변동을 막아줍니다.
기본값은 20이고 특별한 이유가 없다면 기본값을 사용하는 편이 좋습니다.
Mb-Tree와 함꼐 사용되면 이 옵션은 무시됩니다.
- Temp. Blur of Quant after CC : Temp. Blur of est. Frame complexity 옵션과 마찬가지로 프레임 간의 과도한
비트레이트 변동을 막아주는 옵션입니다. 복잡도에 따라 비트레이트를 배분한 후에 적용되어 다시 한 번 프레임 간의
비트레이트 편차를 줄여줍니다. 기본값은 0.5이고 특별한 이유가 없다면 기본값을 사용하는 편이 좋습니다.
- Use MB-Tree : Inter코딩시 블럭 간의 참조 관계를 분석해서 참조율이 높은 부분의 비트레이트를 높여주는 옵션입니다.
즉, Inter코딩시 여러번 참조된 부분의 비트레이트를 높여줌으로써 이후 반복되는 1-1)번 과정에서 예측오류데이터를
줄여줄 수 있습니다. Quantizer Compression 옵션으로 MB-Tree의 강도를 조절할 수 있습니다.
- Nb of Frames for Lookahead : MB-Tree의 블럭 간 참조 관계를 분석하는 데에 사용되는 프레임의 수입니다.
기본값은 40이고 40 ~ 60 사이의 값이 주로 사용됩니다.