QuickTime에서 TimeScale은 정확하게 무엇일까?

이제 Lion이 나온 시점에 QuickTime API에 대해서 쓸 필요가 있겠느냐만, 그래도 여전히 오래된 코드들은 존재하고, 그것을 이해할 필요가 있다. QuickTime은 time-based media에서 non-time-based media까지 커버하고, 단순한 재생용 API가 아니라, 편집이 가능하도록 만들어진 API로 굉장히 잘 만들어졌다.

하지만 그 “잘 만들어졌다”라는 관점은 지원되는 기능에 대한 것이지, 사용하기 쉽게 만들어졌다거나, 정의된 데이터 形이나 기타의 것이 잘만들어졌다는 것은 아니다.

여러가지 중에서 이해하기 곤란한 것이 있는데, Timescale이란 것이 그것이다.
QuickTime의 timecode에 대한 것은 일전에 한번 다루었다. 하지만 충분치 않아서 이번에 완결을 해 볼까 한다.

우선 QuickTime의 시간 표현 법을 보자

12:30:24:1503/3000
12:30:24:12/2997

저 포맷은 다음과 같은 내용이다.
hh:mm:ss:ff/timescale

hh: 두자리의 시간
mm : 분
ss : 초
ff : frame 번호
timescale : QuickTime time scale

여기서 time scale이 문제다. 그리고 저 frame 번호.
어떤 것은 frame 번호가 4자리로, 어떤 것은 2자리로 나와 있다.
과연 두번째 것은 12번째 프레임이란 뜻일까? 혹은 1503은 정말 1503번째 프레임이라는 뜻일까? 저 프레임 번호는 time scale로 본 프레임 번호이다. 그리고 저렇게 timescale 자체가 4자리 일때는 4자리로 봐야 한다. 즉 12처럼 두자리로 나타나질때는 100을 곱해서 1200으로 본다.

왜 QuickTime을 만드는 사람들이 저것을 일관적으로 하지 않았는지는 의문이다. 하지만 여러 미디어 파일을 검사해보고, 실제로 프레임을 하나 하나 다뤄본 결과, 저 frame 번호를 그렇게 해석해야 한다는 것을 알았다.

그렇다면 time scale은 무엇인가? 저것은 해당 퀵타임 파일을 만든 사람이 어떤 번호를 부여하느냐에 따라 의미가 달라지는데, 대부분의 예제를 보면 fps * 100을 한 숫자들이다. 여기서 참 이상한 것은 29.97xxx과 같은 NTSC의 fps인데, 그냥 2997로 표현한다. 그리고 실제 내부에서 계산할때도 2997로 한다.
SMPTE 타임코드와 MPEG을 다뤄보신 분들은 다음과 같이 계산을 할 것이다.

30 * 1000/1001 = 29.97xxx

이렇게 해야 프레임이 밀리지 않지 그냥 29.97로 하드 코딩해 버리면, 프레임이 밀리는 현상이 생긴다.
근데 이것을 QuickTime에서는 그냥 2997로 계산해 버린다.

근데 이전의 포스팅에서도 언급되었지만, 이것이 꼭 fps * 100일 필요는 없다.
이를테면 default 값은 600이다.
혹은 임의로 1000이나 400 등을 해도 된다.
그런데 결론부터 말하자면 fps * 100이 편하다.
왜 그럴까? 사실 그건 직접 생각해 보면 파악할 수있고, 이 포스팅의 요지는 과연 이 time scale이 무엇이냐는 것이다.

Apple의 QuickTime reference를 보면 이게 명확하게 정의가 안되어 있다. 이런 중요한 것은 한 섹션이나 작은 챕터로 만들어도 좋겠는데, 그다지 잘 안되어 있다.
최근에 다음과 같은 내용을 발견했다.

About Movie Time
At the most basic level, the Movie Toolbox allows you to process time based data. As such, the Movie Toolbox must provide a description of the time basis of that data as well as a definition of the context for evaluating that time basis. In QuickTime, a movie’s time basis is referred to as its timebase. Geometrically, you can think of the time base as a vector that defines the direction and velocity of time for a movie. The context for a time base is called its time coordinate system. Essentially, the time coordinate system defines the axis on which the time base vector is plotted. The smallest single unit of time marked on that axis is defined by the time scale as the units per absolute second.

QuickTime에서 시간 좌표계를 설정하는데, 그 좌표계에서는 time base vector가 찍히는 것이라고 되어 있다. 그리고 그 좌표계에서 가장 작은 단위로 좌표 축에 찍히는 단위는 “절대 시간” 당 몇 유닛이냐는 것이다
음.. 잘 이해가 되지 않는다.

다행스럽게도 그 다음 섹션에 더 명확하게 설명이 나와있다.

Time Coordinate Systems movie’s time coordinate system provides the context for evaluating the passage of time in the movie. If you think of the time coordinate system as defining an axis for measuring time, it is only natural that this axis would be marked with a scale that defines a basic unit of measurement. In QuickTime, that measurement system is called a time scale.

A QuickTime time scale defines the number of time units that pass each second in a given time coordinate system. A time coordinate system that has a time scale of 1 measures time in seconds. Similarly, a time coordinate system that has a time scale of 60 measures sixtieths of a second. In general, each time unit in a time coordinate system is equal to (1/time scale) seconds. Some common time scales are listed in Table 1-1.

일단 time scale의 의미는 QuickTime에서 시간 축에서의 측정 단위다라는 것이다. 이 말은 cm가 길이를 재는 단위이다. 뭐 이런 수준의 설명이다. 그보다는 두번째 문장의 첫 줄에서 더 명확하게 정의를 내렸다.
즉 주어진 시간 좌표계에서 1 초당 몇개의 time unit이 지나가느냐라는 것이다. 더 쉽게 말하면 1초를 몇개의 구간으로 나누느냐이다.

time scale의 정의
1초당 몇개의 time unit이 지나가느냐 혹은 1초를 몇개의 구간으로 나누느냐.

예 : 1 초를 1000개의 구간으로 나누면, 두 눈금간의 시간 거리는 1/000 초이다. 이것은 1 msec이다.
이것을 QuickTime의 time scale로 말하면, “time scale이 1000이다”라고 말한다.

위의 둘째 문장에서 나온 예를 생각해 볼까? time scale이 60이라는 것은, 1초를 60개의 구간으로 나눈다는 것이다. 즉 1초에 60개의 time unit이 지나간다. 이때 한 time unit의 시간은 1/60 초이다.
일반화 해서 말하자면, 한개의 time unit은 1/time scale이다.
간단한 산수다.

자 그럼 왜, fps * 100을 time scale로 하는 경우가 많은지 생각해 보자.
아니 100을 곱하건 뭘 곱하건, 기본이 fps으로 한다는데 중요한 의미가 있다.

자 PAL의 25 fps을 생각해 보자.
이것은 1초에 25장의 프레임을 보여준다. 만약 time scale을 25로 한다면, 1초에 25개의 time unit이 지나가니까, 1장당 1 time unit이 되는 것이다. 만약 같은 frame rate에서 time scale을 30으로 해보자, 혹은 45로 해보자. 계산이 슬슬 복잡해지기 시작하고, 나누어도 딱 떨어지지 않는다. 어차피 time based media는 한 프레임, 혹은 한 샘플을 표시하고 다음 것을 표시하는데 얼마나 시간을 지연시키고, 몇개 프레임/샘플 후의 시간은 얼마다라는 것을 아는 것이 중요하기 때문에, 1 프레임/샘플당으로 time unit을 설정하면 편할 것이다.

그럼 여기에 왜 100을 곱할까? non drop frame인 경우야 별 문제가 안되겠지만, 23.976이나 29.976과 같은 나누어서 딱 떨어지지 않는 frame rate이 존재한다. NTSC와 같은 것이 대표적이다.
이것은 24 * 1000/1001 혹은 30 * 1000/1001로 계산을 한다.
이런 frame rate를 가지는 미디어를 다룰때, 좀더 세밀하게 시간을 계산해야할 필요가 있다. 왜냐하면, 딱 떨어지지 않는 숫자기 때문에, 매 2초마다 1장을 drop 시킨다던가 할 필요가 있는고, 편집을 하려해도 이런 세세한 제어가 필요하기 때문에 그냥 fps를 timscale로 쓰지 않고, 그것에 어떤 수를 곱해서 더 세밀하게 만드는 것이다.

여기서 주의해야 할 것이 있다. QuickTime의 atom에 frame rate를 기록해 두고, duration도 계산해서 넣어야 하는데, 이때 a * 1000/1001을 할까? 실제로 보니 그렇게 하지 않고, 예를 들면 23.97로 넣는다.
이것은 그냥 meta 정보 역할을 하는 것같다. 만약 실제로 그 atom을 읽어서 비디오 에디터등을 만든다면, 그런 값을 보면 실제의 계산을 해 줄 필요가 있을 것이다.

그리고 또하나, frame drop을 한다는 것은 실제로 어떤 프레임을 버리는 게 아니다.
frame은 하나도 버리지 않고, 단지 time code marking을 마치 프레임 드롭이 된 것처럼 하는 것이다.

예를 들어, 1초, 2초, 3초, 이러다가 4초가 아니라 5초로 마킹을 한다.
그럼 4초에 해당하는 frame을 버린 것 같은 모습이 된다. 실제 4번째 장은 5초에 대응할 뿐이다.

자 그럼 여기서 한가지만 더.
제일 처음으로 가서 QuickTime에서의 시간 포맷을 보자.

12:30:24:1503/3000

여기서 명심해야 할 것이 있다.

우선 /는 나누기가 아니라, time code와 time scale을 구분해 놓은, 구분자이다.
둘때로 1503은 frame number에 대응을 하지만, 사실 “시간”의 표현이다.
SMPTE time code 포맷은 “시간:분:초:프레임 번호”로 분명히 time code임에도 frame 번호는 몇번째 프레임이냐지, 그 프레임이 시간 축에서 차지하는 시간을 의미하지 않는다. (물론 환산이 가능하지만)
반면에 QuickTime의 timecode는 순수하게 시간의 요소들만으로 구성되어 있다.
그리고 각각의 시간 값을 time value라 한다.
즉 위의 QuickTime 시간 포맷에서

12:30:24:1503는 time value를
3000은 time scale을 의미한다.

정리가 잘 안되었는데, 아무튼 이것이 QuickTiem에서의 시간에 대한 전체적인 설명이다.
QuickTime에서 이 시간을 이해하면, 이해의 30%는 한 것이라고 볼 수있다.

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: