x264에서는 VBV라는 이름으로 사용되고 있지만 H.264/AVC 표준상의 정식 명칭은 HRD(Hypothetical Reference Decoder)입니다.

기존의 MPEG-2 표준에서 이미 VBV라는 이름으로 정의되어 있었지만 H.264/AVC 표준에서는 좀 더 일반화해서 HRD라는 이름으로

재정의 했다고 합니다. (VBV와 비교해서 HRD에서는 뭔가 달라진게 있는지, 있다면 어떤 건지는..잘 모르지만 비슷한 개념입니다.)

x264 옵션에서도 HRD라는 용어 대신 이미 익숙한 용어인 VBV를 사용하고 있는 것 같습니다.


VBV(Video Buffering Verifier), HRD(Hypothetical Reference Decoder)는 말 그대로 "비디오 버퍼 검증기", "가상 참조 디코더"입니다.

"가상 참조 디코더"라는 용어가 좀 더 이해하기 쉬울 것 같은데요

방송국에서 HDTV 영상신호를 전송하고 가정에서 이를 디지털TV로 재생하는 경우로 예를 들어 생각해 보겠습니다.

이 때 가정에서 전송받은 영상신호가 원활하게 재생되려면 영상을 인코딩하는 방송국 입장에서는 여러가지 생각해야 할 것들이 있습니다.

영상신호를 전송하는 대역폭이라든지, 전송받은 데이터를 보관해두는 (상대방의)비디오 버퍼의 크기 등을 고려해야 합니다.

일반PC에서 하드디스크에 저장된 영상을 재생하는 경우에는 비디오 버퍼가 크게 문제될 게 없지만 대부분의 하드웨어 재생기는

비디오 버퍼의 크기가 한정돼있기 때문에 이를 맞춰주지 않으면 재생시 문제가 발생합니다.

그렇다면 인코딩된 영상을 상대방측에서 정상적으로 재생할 수 있을지 미리 확인해 보는 게 좋겠죠.

그래서 영상을 인코딩할 때, 영상을 받아 볼 상대방의 환경과 똑같은 가상의 모델을 인코더 내에 만들어 놓고 인코딩된 영상이

이 모델에서 문제없이 재생되는지를 체크하면서 인코딩을 합니다.

이처럼, 인코딩된 영상을 상대방이 제대로 재생할 수 있을지 미리 알아보기 위해 인코더 내에 만들어진 "가상의 모델(디코더)"을

VBV(Video Buffering Verifier) 또는 HRD(Hypothetical Reference Decoder) 즉, "가상 참조 디코더"라고 합니다.


대략적인 개념은 위에 있는 내용이지만 조금 더 자세하게 VBV의 작동 방식을 말씀드리면

먼저, 하드웨어 재생기에서 영상신호를 재생하는 과정은 다음와 같습니다.

1. 일정한 속도로 전송받은 영상신호가 비디오 버퍼에 쌓입니다.

2. 비디오 버퍼에 어느정도 데이터가 쌓이면 버퍼에 모인 데이터를 일정 시간마다 디코더가 필요한 만큼 가져가서 재생합니다.


1번 과정에서 비디오 버퍼에 데이터가 쌓이는 속도는 일정하다고 말씀드렸는데, 예를 들면 블루레이 디스크에서 데이터를 읽어오는 

속도라든지 HDTV신호가 전송되는 속도 등을 말하는 겁니다.

(즉, 단순히 비디오 버퍼에 데이터가 입력되는 속도일 뿐 실제 영상의 비트레이트와는 아무런 관계가 없습니다.)


영상신호가 임시로 저장되는 비디오 버퍼는 물통을 생각하면 이해하기 쉬운데요,

3리터의 물통에 초당 1리터의 물이 들어오고 있고, 초당 1리터의 물이 또 빠져 나가는 경우라고 보시면 됩니다.

"3리터의 물통"은 비디오 버퍼의 크기, "물통에 들어오는 초당 1리터의 물"은 전송받는 데이터, "물통에서 나가는 초당 1리터의 물"은

일정 시간마다 디코더가 재생하기 위해 가져가는 데이터라고 보시면 되겠죠.

위와 같은 경우에는 들어오는 물과 나가는 물의 양이 같기 때문에 물통에 있는 물의 양은 일정하게 유지되겠죠.

이 때 "일정 시간마다 디코더가 재생하기 위해 가져가는 데이터" 즉, 영상의 비트레이트가 높아지면 어떻게 될까요?

들어오는 물의 양은 초당 1리터인데 빠져 나가는 물의 양이 초당 2리터가 된다면...점점 물통에 있는 물의 양이 줄어들겠죠.

그렇게 3초가 지나면 3리터의 물통에는 더이상 물이 남아있지 않게 됩니다. (초당 1리터씩 줄어들 테니까요.)

그러면 디코더가 재생하기 위해 필요한 데이터를 가져갈 수 없는 상황이 되고 결국 재생이 멈추거나 오류가 발생하겠죠.

이렇게 비디오 버퍼에서 데이터가 고갈되는 현상을 Buffer Underflow라고 합니다.

반대로 영상의 비트레이트가 낮아지면서 비디오 버퍼에 데이터가 넘치는 현상은 Buffer Overflow라고 합니다.

사실 오버플로우는 디코더에서 제어가 가능하기 때문에 문제가 되는 건 언더플로우입니다.

언더플로우가 발생하면 정상적인 재생이 불가능하기 때문에 이를 방지하기 위해 VBV가 필요한 것이죠.


실제 인코딩 과정에서 VBV가 작동하는 방식도 물통의 경우와 비슷합니다.

예를 들어 영상신호를 전송받는 상대방의 비디오 버퍼가 3000kb이고 버퍼에 데이터가 전송되는 속도는 1000kb/s라고 가정해 보면,

인코더쪽에서도 비디오 버퍼의 크기가 3000kb이고 버퍼에 입력되는 데이터의 속도가 1000kb/s인 가상의 모델(VBV)을

세팅해 놓고, 인코딩 중에는 항상 가상의 비디오 버퍼에 데이터가 얼마나 있는지를 체크합니다.

그래서, 영상의 비트레이트가 1000kb/s보다 높은 상태로 계속 유지되면서 가상 비디오 버퍼에 데이터가 얼마 남지 않게되면

인코더는 영상의 비트레이트를 낮춰서 가상 비디오 버퍼에 데이터가 쌓이게 합니다.

반대로 비트레이트가 1000kb/s보다 낮은 상태로 계속 유지되면서 가상 비디오 버퍼에 데이터가 넘칠것 같으면

인코더는 영상의 비트레이트를 높여서 가상 비디오 버퍼에 데이터가 넘치지 않게 합니다.

이런식으로 인코딩을 하면 3000kb의 비디오 버퍼와 1000kb/s의 전송속도를 가진 상대방이 이 영상을 전송받아 재생할 때

언더플로우나 오버플로우 없이 월활한 재생을 보장할 수 있게되겠죠.

즉, VBV는 주어진 환경(일정한 비디오 버퍼 크기와 전송속도)에서 언더플로우나 오버플로우가 발생하지 않는 스트림을 만들기 위해서

인코더측에 만들어지는 "가상의 상대방(모델)"이라고 할 수 있겠습니다.

실제로 HDTV영상이나 블루레이 디스크에 담긴 영상 등은 이런식으로 VBV를 만족하는 영상들입니다.

이 외에도 스트리밍 동영상이나 휴대기기에서 재생할 동영상을 인코딩 할 때는 VBV를 사용하는게 좋겠죠.


x264에는 VBV와 관련된 옵션이 두 가지가 있는데 하나는 --vbv-maxrate이고 또 하나는 --vbv-bufsize입니다.

옵션명에서 어느정도 감이 오시겠지만 --vbv-maxrate는 가상 비디오 버퍼에 입력되는 데이터의 전송속도입니다.

--vbv-bufsize는 가상 비디오 버퍼의 크기입니다. (기본값은 0으로 둘 다 사용하지 않게 되어 있습니다.)

위에서 설명 중간에 말씀드린대로 오버플로우는 디코더에서 제어가 가능하기 때문에 x264의 VBV는 언더플로우만 제어합니다.

또한 x264는 MB-Tree에서 도입됐던 Lookahead를 사용해서 훨씬 효율적인 VBV가 가능하게 합니다.

Lookahead는 1패스 인코딩처럼 영상의 전체적인 모습을 알지 못한 채 인코딩하는 경우에, 현재 인코딩하려는 구간에 이어지는

'일정한 길이의 다음 구간'이 어떤지를 미리 살펴보는 기능이라고 보시면 됩니다.

이렇게 다음에 나타나는 구간이 어떤지를 미리 봄으로써 현재 인코딩하려는 구간의 비트레이트를 더 효율적으로 조절할 수 있게 됩니다.


지금까지 설명드린대로...위 옵션들은 VBV를 사용해야 하는 환경이 아니라면 사용할 필요가 없습니다.

VBV는 주어진 상황에 맞는 영상을 만들기 위해 x264의 비트레이트 배분방식에 '제한'을 가하는 거니까요.

하드디스크에 있는 영상들을 좀 더 작은 사이즈로 인코딩하는 게 대부분인 저 같은 경우에는 한 번도 사용한 적이 없는 옵션입니다.

또한 사용한다고 해도 자신이 임의로 정해서 쓰는 게 아니라 주어진 상황에 맞는 값들이 이미 정해져 있는 옵션들이죠.

(예를 들면 블루레이의 경우 --vbv-maxrate는 40000, --vbv-bufsize는 30000 이라고 합니다.)


http://spreadsheets.google.com/pub?key=tYGTjNd0dG6P_A9z-YkFzFg&output=html


마지막으로 위 링크는 각종 하드웨어 재생기들의 VBV 세팅값들을 정리해 놓은 시트인데요 VBV를 사용해서

인코딩해야 하는 경우가 생겼을 때 참고하시면 좋을 것 같습니다.

(같은 기기라도 우리나라와 외국은 스펙이 서로 다른 경우도 있다는 말을 어디서 본 것 같은데 잘 맞을지는 모르겠습니다...)




Posted by 김코덱