H.264/AVC 영상의 레벨은 이 글에서 말씀드린대로 해당 영상을 재생하려면 어느정도의 자원이 필요한지에 따라서

나눠지는 등급이라고 할 수 있습니다. (H.264/AVC 표준 상에 이미 정해져 있는 값이죠.)

예를 들어 1920x1080 해상도의 영상을 인코딩하면서 참조프레임(--ref) 수를 5 이상 사용하게 되면 레벨 4.1을 넘게 됩니다.

레벨 4.1에서는 1920x1080 해상도에서 최대로 사용 가능한 참조프레임 수가 4로 정해져있기 때문이죠.

또한 1920x1080 해상도에서 최대로 사용 가능한 프레임 레이트는 30이기 때문에 1920x1080p 60fps 영상도 레벨 4.1을 넘게 됩니다.

즉, 레벨은 해상도별로 영상의 참조프레임 수나 프레임 레이트 등에 따라서 정해지는 것이고 인코더가 임의로 바꿀 수는 없는 것입니다.


그런데 x264cli(--level)나 MeGUI의 x264 설정에는 레벨을 정해주는 옵션이 있습니다.


이 그림에 나오는 것처럼 사용자가 임의로 레벨을 입력할 수 있게 되어있죠.

앞서 말씀드린대로 레벨은 참조프레임이나 프레임 레이트 등에 따라서 나눠지는 것인데 이 옵션은 왜 있는 걸까요?

x264cli나 MeGUI의 레벨 옵션은 하는 일이 딱 두 가지입니다.

  1. 영상에 레벨 플래그를 입력합니다.
  2. 프리셋(--preset)에 의해 적용되는 참조프레임(--ref) 수를 조절합니다.
1번에서 말하는 레벨 플래그는 mediainfo 등으로 영상을 열어봤을 때 표시되는 레벨 정보를 말합니다.
단순히 "이 영상의 레벨은 x.x 이다" 라는 이름표만 붙여주는 것일 뿐이고 실제로 영상에 어떤 변화를 주는 것은 아닙니다.
하지만 2번의 기능은 참조프레임 수를 바꾸기 때문에 영상의 속성도 바뀌게 됩니다.
예를 들면 프리셋 slower에서 사용하는 참조프레임의 수는 8입니다.
그런데 인코딩하려는 해상도가 1920x1080 이라면 프리셋 slower는 레벨 4.1을 넘게 되겠죠.
이 때 레벨 옵션을 4.1로 지정해주면 프리셋에 정의된 참조프레임 수가 레벨 4.1을 넘지 않도록 자동으로 낮춰줍니다.
이 경우에는 참조프레임 수를 4로 낮추는 것이죠.
그런데 여기서 중요한 점은 프리셋에 정의된 참조프레임 수를 조절한다는 것입니다.
다시 말하면 사용자가 직접 입력한 참조프레임 수는 레벨 옵션으로 수정되지 않습니다.
(사용자가 직접 입력한 옵션값들이 프리셋보다 우선 적용됩니다.)

예를 들어 인코딩 해상도가 1920x1080일 때 MeGUI 설정창의 프리셋은 slower, 참조프레임 수는 5, 레벨 옵션은 4.1로 입력하고 인코딩하면 어떻게 될까요?
레벨 옵션이 4.1이기 때문에 이 영상을 mediainfo 등으로 열어보면 레벨 4.1로 표시될 겁니다.
하지만 직접 입력한 참조프레임 수가 5이기 때문에 실질적인 영상의 레벨은 5.0이 맞겠죠.
(레벨 옵션으로 조절되는 건 프리셋의 참조프레임이기 때문에 직접 입력한 참조프레임 5가 우선 적용되는 것입니다.)
결국 영상의 실제 레벨(5.0)과 영상에 붙여진 레벨 표시(4.1)가 달라지게 됩니다.

이처럼 프리셋만을 사용해서 인코딩하는 경우가 아니라면 레벨 옵션이 실질적으로 하는 일은 그냥 플래그만 입력하는 것 뿐입니다.
따라서 x264 옵션을 직접 입력하는 경우라면(이런식으로 인코딩하시는 분이 더 많을 겁니다.) 레벨 옵션은 사용하지 않는 편이 좋습니다.
위의 예에서처럼 영상의 실제 레벨과 영상에 입력된 레벨 플래그가 어긋나는 경우가 발생하기 때문이죠.
간혹 레벨 플래그를 속여서 하드웨어 재생을 가능하게 하려는 이유로 레벨 옵션이 사용되기도 하지만..
그런 경우가 아니라면 x264가 알아서 정확한 레벨 플래그를 입력하도록 놔두는 것이 좋겠죠.




Posted by 김코덱
,