인코딩을 하다보면 가끔 VFR(Variable Frame Rate)로 작업해야 할 때가 있습니다.

24p와 30p가 섞여있는 소스를 인코딩하거나 60i 소스의 구간별로 30p와 60p를 따로 적용하고 싶다면 VFR을 사용해야 하죠.

VFR 인코딩에는 Decomb나 TIVTC 같은 필터가 주로 사용되는데 자동으로 24p와 30p를 구별해서 타임코드와 스크립트를 만들어 줍니다.

하지만 극히 일부 구간에서만 프레임 레이트를 다르게 만들고 싶은 경우에는 수동으로 타임코드와 스크립트를 만드는 것이

훨씬 간단하고 빠르기도 합니다. 게다가 Decomb나 TIVTC만으로는 30p와 60p가 혼합된 VFR 인코딩은 불가능하죠.

따라서 수동으로 스크립트와 타임코드를 작성하는 방법도 함께 알아두시면 좋습니다.


먼저 수동으로 스크립트를 작성하는 방법입니다.

예를 들어 소스 영상은 총 60000 프레임(60i)이고 이 중 앞 부분 30000 프레임은 30p 촬영, 뒷 부분 30000 프레임은 24p 촬영이라고 가정하면

다음과 같이 avs 스크립트를 작성합니다.

s=MPEG2Source("source.d2v")


video=trim(s,0,29999).yadif().assumefps(27)

film=trim(s,30000,59999).tfm().tdecimate().assumefps(27)


unalignedsplice(video,film)


avisynth에서는 프레임 레이트가 다른 클립을 서로 이어붙일 수 없기 때문에 그 중간 정도인 assumefps(27)로 똑같이 맞춰주는 겁니다.

이렇게 만든 스크립트를 그대로 인코딩하면 27fps의 CFR 영상이 되겠죠.

즉 앞 부분에서는 원본보다 느리게 재생되고 뒷 부분에서는 원본보다 빠르게 재생됩니다.

따라서 구간 별로 프레임 레이트를 따로 지정해 줘야 하는데 이 때 사용되는 것이 타임코드 파일입니다.

위의 경우에는 아래와 같이 텍스트 파일을 작성하면 됩니다.

# timecode format v1

assume 29.97

# TDecimate v1.0.3 by tritical

30000,53999,23.976


assume 29.97은 영상의 전체적인 프레임 레이트를 정해주고 그 아래로 구간별 프레임 레이트를 정할 수 있습니다.

30000,53999,23.976은 30000 ~ 53999 구간을 23.976fps로 정한다는 뜻입니다.

(TIVTC가 적용됐기 때문에 뒷 부분의 프레임 수가 24000으로 줄어들고 따라서 총 프레임 수는 54000이 되겠죠. 이 부분을 주의해야합니다.)

구간 시작 프레임, 구간 종료 프레임, 프레임 레이트 이런식으로 콤마로 구분해서 작성하면 됩니다.

(여기에서는 한 구간만 입력했지만 줄을 바꿔서 얼마든지 구간을 추가할 수 있습니다.)

따로 지정되지 않은 구간은 assume 29.97에서 정해진대로 29.97fps가 적용됩니다.

0 ~ 29999 구간은 따로 정해주지 않았으니까 29.97fps가 적용되는 것이죠.


이렇게 작성된 타임코드 파일을 인코딩 영상에 적용시켜야 하는데 방법은 두 가지가 있습니다.

첫 번째 방법은 avs 스크립트를 그대로 인코딩해서 27fps의 CFR 영상을 만든 다음 먹싱 과정에서 타임코드 파일을 넣어주는 것이고,

두 번째 방법은 avs 스크립트를 인코딩하는 과정에 타임코드를 직접 입력시키는 것입니다. 그러면 VFR 영상이 바로 만들어지게 되고

먹싱 과정에서 따로 타임코드 파일을 넣어주지 않아도 됩니다.

두 번째 방법은 이 글에서 이미 언급한대로 비트 배분이 더 효율적이기 때문에 되도록이면 두 번째 방법을 사용하는 것이 좋습니다.

다만 x264로 인코딩하는 경우에만 가능하죠. (x264의 --output을 mp4, mkv, flv 등의 컨테이너로 지정해야 합니다.)




Posted by 김코덱