2010년 1월 21일 목요일

mkv 가변 프레임 VFR 편법(?)으로 만들기

이 방법은 LigeL 님께서 소개하신 것인데 (원문 : http://vidcorea.net/bbs/board.php?bo_table=B05&wr_id=36) 제가 스샷을 곁들여서 설명드리겠습니다.

 

요즘 인기리에 방영중인 드라마 추노는 RED ONE 이라는 4k 디지털 카메라로 촬영되었습니다. 원래 23.976fps로 촬영되었기 때문에 TV로 송출하기 위해서는 Telecine 이라는 작업을 거치게 됩니다. 우리나라에서는 방송이 29.97fps로 송출되기 때문에 영화나 추노같은 드라마는 이렇게 Telecine 이 필요합니다. 이 경우 3:2 풀다운이라 하는데 위키백과에 나온 그림을 가져와 설명드리겠습니다.

 

 

위 그림을 보시면 직관적으로 이해가 되실 것 같습니다. 24프레임을 30프레임으로 늘여주기 위해서 중간에 없는 프레임을 합성해서 만들어야 하는데 위 그림에선 A B C D 를 A B (BC) (CD) D 프레임으로 늘였습니다. 이렇게 A B D 프레임은 멀쩡하지만 중간에 (BC) (CD) 프레임은 합성된 상태로 들어가기 때문에 위 패턴에서는 3번 멀쩡한 프레임이 나오고 2번 합성된 프레임이 나옵니다.

 

실제 추노 HDTV 원본파일을 연속 5프레임 리사이즈만 해서 보여드리겠습니다.

 

 

 

보시다시피 처음 1,2번 프레임은 멀쩡하고 3,4번 프레임은 서로 다른 프레임이 겹쳐있는 모습이고 다시 5번 프레임은 멀쩡하게 나옵니다.

 

물론 집에서 TV로 보면 이렇게 풀다운된 영상이 전혀 어색하게 보이지 않습니다. 왜냐하면 TV는 인터레이스 스캔(비월주사 방식) 으로 각 프레임을 홀수 필드와 짝수 필드로 나누어 번갈아가며 쏘기 때문에 (요즘은 디지털 TV도 많이 보급되었지만)

 

실제로는 29.97fps라는게 59.94fps로 보입니다. 위 ABCD로 설명드리자면

 

A A B B B C C D D D

 

위 셋트가 1초에 6번 반복됩니다. 그래서 화면 진행이 둘 셋 둘 셋 으로 진행되어 실제 프레임의 전환 주기가 2:3으로 빨랐다 느렸다를 반복하지만 그 주기가 워낙 짧기 때문에 눈으로 느끼지는 못하는 것이지요.

 

그런데 이렇게 3:2 풀다운된 영상을 일반적인 디인터레이싱 필터로 처리해서 프로그래시브 인코딩을 하면 문제가 발생합니다. 원래 4개밖에 없던 프레임을 5개로 보여주면서 인터레이스를 제거하려면 결국 하나의 프레임은 중복될 수 밖에 없는 것이죠. 그래서 추노를 IVTC 처리하지 않은 일반적인 공장릴들은 프레임 진행이 이렇게 됩니다.

 

A B C D D

 

즉 4번 가다 한번 멈추는 패턴이 반복됩니다. 이건 민감한 분들이라면 느끼실 수 있습니다. TV로 방송 원본을 볼 때는 60개의 필드가 연속해서 보이기 때문에 A A B B B C C D D D가 별로 어색하게 보이지 않지만 (워낙 짧은 시간이라서) 30프레임 프로그래시브 인코딩된 파일을 PC에서 보면 A B C D D 패턴은 충분히 어색하게 보일 수 있습니다. 물론 화면의 변화가 별로 없는 정적인 장면에서는 별 문제가 없지만 동적인 장면에서 그렇다는 것이지요. 장면이 4번 움직이다 1번 멈췄다 다시 4번 움직이다 1번 멈췄다를 반복하기 때문입니다.

 

그래서 추노같은 드라마나 TV로 방송되는 영화같은 경우 인코딩을 하려면 IVTC 작업을 해줘야 합니다. 풀다운된 영상을 원래의 23.976fps로 되돌리는 것이죠. 즉 위 그림으로 설명하자면 A B D 프레임은 그대로 두지만 (BC) 프레임과 (CD) 프레임은 하나로 줄여야 하기 때문에 (BC) 프레임의 Bottom 필드인 C와 (CD) 프레임의 Top 필드인 C를 꺼내서 온전한 C 프레임을 복원시켜 주는 것입니다. 물론 IVTC 방식에도 여러가지가 있을테고 제가 설명드린 것이 틀렸을 수도 있지만 개략적인 개념은 그렇다는 것입니다.

 

그런데 이렇게 IVTC 작업을 하면 또 문제가 되는 부분이 생깁니다. 바로 자막이 지나가거나 엔딩 스크롤이 올라가는 부분입니다. 자막이나 엔딩스크롤은 30프레임이고 드라마 본편은 24프레임입니다. 그래서 일괄적으로 IVTC를 하면 자막이나 엔딩스크롤이 어색해집니다. 원래 30프레임인데 24프레임으로 줄이다보니 3번 잘 가다가 한번 껑충 뛰고 다시 3번 잘 가고 한번 껑충 뛰는 현상이 나타나게 됩니다.

 

따라서 자막 부분도 어색하지 않고 본편도 어색하지 않도록 처리해주기 위해 가변 프레임 VFR 방식이 사용될 수 있습니다. 본편은 IVTC 작업을 해서 24프레임으로 돌리고 자막 부분은 일반적인 디인터 작업을 해서 30프레임으로 돌리는 것입니다. 물론 자막 부분을 30프레임으로 처리하면 앞서 말씀드린대로 자막 뒤로 보이는 화면은 A B C D D 패턴으로 진행되어 조금 어색해지지만 대신 자막은 A B C D E 패턴으로 멀쩡하게 진행됩니다.

 

이렇게 가변 프레임 방식을 적용하려면 원래는 조금 복잡합니다. 그리고 AVI 컨테이너에서는 지원하지 않고 MP4나 MKV 컨테이너에서 지원합니다. 하지만 수동으로 변법(?)을 써서 처리하는 방법을 이번에 LigeL 님께서 소개해주신 것이고 제가 이에 대해 스샷으로 설명드리겠다는 것입니다.

 

추노 5회를 가지고 설명드리겠습니다.

 

제가 d2v를 추출한 기준으로 총 115620개의 프레임 중에 0번부터 113786번 프레임까지 총 113787개의 프레임은 IVTC 작업을 해주고 엔딩스크롤이 시작되는 113787번 프레임부터 115619 마지막 프레임까지는 Yadif로 디인터 처리를 해줄 생각입니다.

 

 

 

 

AVS 스크립트 예제

 

LoadPlugin("C:\Program Files (x86)\megui\tools\dgindex\DGDecode.dll")
LoadPlugin("C:\Program Files (x86)\megui\tools\avisynth_plugin\ColorMatrix.dll")
Load_Stdcall_Plugin("C:\Program Files (x86)\megui\tools\yadif\yadif.dll")
DGDecode_mpeg2source("source.d2v", info=3)
ColorMatrix(hints=true, interlaced=true, threads=0)
film=trim(0,113786).Telecide(guide=1).Decimate(quality=3).assumefps(23.976)
ending=trim(113787,115619).Yadif(order=-1).assumefps(23.976)

unalignedsplice(film,ending)
crop( 2, 0, -2, 0)
LanczosResize(1280,720)

 

여기서 Yadif 뒤에 assumefps(23.976) 부분이 이상하게 보이실 수도 있습니다. 왜 29.97이 아니냐고 말이죠. 이 값은 아무런 의미가 없습니다. 그냥 필름 부분과 엔딩 부분의 fps 값을 동일하게 적어줘야 트림으로 자른 것을 이어서 붙일 수 있기 때문입니다. 어차피 mkv 나중에 음성이랑 먹싱할 때 타임코드 가지고 새로 fps를 지정해야 하기 때문에 지금 저 값은 어떤 값을 넣든 상관이 없는 것입니다.

 

이렇게 만든 스크립트를 다시 불러봅니다. 그럼 이번엔 IVTC 때문에 프레임이 많이 줄어들었을텐데 다시 자막이 시작되는 부분을 찾아갑니다.

 

 

 

원래 총 115620 개의 프레임이었지만 새로 만든 스크립트에선 총 92862개의 프레임이 존재합니다. 드라마 본편은 IVTC로 인해 프레임이 줄어들었기 때문이지요.

 

이걸 대략 숫자로 설명하면 IVTC 처리된 113787개의 프레임에 0.8을 곱하면 91029.6 인데 위에서 보시다시피 엔딩스크롤이 시작되는 부분이 91029로 거의 정확히 떨어집니다. 이렇게 Yadif 처리된 프레임의 시작부와 끝부분의 숫자를 적어둔 다음 아래와 같은 타임코드를 작성합니다.

 

# timecode format v1
assume 23.976
#
91029,92861,29.97

 

위 4줄을 텍스트파일로 저장한 다음 mkvmergeGUI로 먹싱할 때 비디오 부분에 타임코드 파일을 넣어주시면 됩니다.

 

두번째 줄은 전체를 23.976fps로 지정하는 것이고 네번째 줄은 그중에 일부 구간을 29.97fps로 지정하는 것입니다. 바로 Yadif 처리된 91029 프레임부터 92861 끝까지입니다.

 

원래 24000/1001 = 23.97602397602398 이고 30000/1001 = 29.97002997002997 이지만

실제로 뒤에 붙어있는 숫자들은 의미가 없습니다. 예를 들어 23.976023에서 최대로 양보해서 0.00003의 오차가 발생한다 가정해도 1프레임 차이를 만들기 위해서는 33333초가 필요한데 이는 9시간이 넘습니다. 즉 fps를 23.976으로 적었을 시 24000/1001과 1프레임 차이가 나려면 9시간 이상 재생되어야 합니다. 그리고 9시간 재생되어 1프레임 간격이 벌어진다고 한들 이는 불과 0.04초이기 때문에 음성이 9시간에 걸쳐 점점 빨라져 9시간 후에는 0.04초 빨라진다고 한들 1시간짜리 드라마에서는 0.004초 빨라질 것이고 이를 눈과 귀로 느낄 사람은 아무도 없겠지요.

 

아무튼 이렇게 작성한 타임코드를 나중에 음성이랑 먹싱할 때 넣어주시면

 

 

 

 

본편은 24프레임으로 엔딩스크롤은 30프레임으로 재생되는 편법(?) 가변프레임 영상을 만들어내실 수 있습니다.

 

댓글 14개:

  1. 한때는 저렇게 잘라서 했었는데 easyvfr 쓰면 편하더군요



    스크립트는 좀 더 길어지긴 합니다만 자동으로 타임코드 파일을 만들어줘서..

    답글삭제
  2. 개인적으론...공장릴들은 그냥 인터레이스드 상태로 내놨으면 좋겠네요.



    물론 본문에 소개하신 것처럼 제대로 처리해서 하면 좋겠지만, 어설프게 할꺼면 그냥 인터레이스 상태로 냅두는게 용량도 적고 화질도 오히려 낫습니다. (모 아니면 도랄까요?)



    요즘 그래픽 카드들 하드웨어 가속 디인터레이싱 품질이 장난이 아니거든요.(9800GTX나 5870으로 HQV라는 DVD플레이어 화질 벤치마크용 DVD 돌려보면 디인터레이싱이나 인버스 텔레시네나 완벽한 정답에서 딱 한발짝국만 남긴 느낌이랄까...오히려 PowerDVD 같은데서 자체적으로 - 소프트웨어적으로 - 제공 하는 고급 스마트 디인터레이싱들이 한 수 뒤지더군요. http://www.parkoz.com/zboard/view.php?id=vga_freeboard&no=19829 이건 제가 DVD 업스케일링 관련해서 삽질하다 알아낸 것들...)

    답글삭제
  3. 우왕.. 5등에 이어서 4등.. ㅎ



    최근 올리신 세 글을 보니 컴퓨터를 좋아하는 사람들에서 인코딩을 좋아하는 사람으로 블로그 성격이 바뀔 것 같기도 하네요 ㅎ

    답글삭제
  4. 초보자에겐 쉬우면서도 중요한 정보를 알아가니 제가 하루에 몇번이나 이 블로그를 클릭하나 봅니다 ㅋ



    30프레임이나 60프레임, TP파일 영상들을 볼때의 차이가 왜 일어나는지 이제야 조금 이해가 되네요

    답글삭제
  5. 저는 그냥 아....하는 정도네요 ㅠ.ㅜ

    신세계...

    답글삭제
  6. 게시글에 어울리지 않는 질문이지만, 윈도우7 설치후 게임을 실행시키면 화면이 정사각형에 양쪽이 비는 현상이 계속 되는데요.

    제 그래픽카드는 라데온 HD3430인데 인터넷에 검색해보면 지포스 관련 해결방법만 있더라구요.

    이거 해결 방법좀 가르쳐 주시면 감사하겠습니다~

    답글삭제
  7. 오랜만에 쓰시는 인코딩관련글이군요..ㅎㅎ



    다른건 특별한거 없고..



    타임코드 작성이 중요한것같습니다.



    잘못작성하면.. 싱크가 아예 틀어저버리더라는..



    꼼꼼하신분들이야 아무 문제없겠지만요.

    답글삭제
  8. 초보자분들은 저게 뭔가 하실듯 ㅋ

    답글삭제
  9. 역텔레시네를 하지 않은 공장릴은 이렇게 진행됩니다

    A B b+c(blend) c+d(blend) D



    근데 역텔레시네를 하지 않았다 하더라도



    왠만해선 어색한걸 느낄수 없습니다



    단 화면 전체가 움직이는 씬에서는



    완전 뚝뚝 끊기죠

    답글삭제