어제에 이어 또 동영상 이야기입니다. 이런 매니악한(?) 이야기에는 별 관심이 없으실 테지만... 제목은 변환하기인데 동영상을 인코딩 하는 방법은 아니고 단순히 싱크에 맞게 음성을 리먹싱 하는 이야기입니다.

먼저 초보 분들을 위해 PAL과 NTSC 이야기를 간단히 해야겠네요. 아마 DVD에 관심있는 분들은 한번 쯤 들어보셨을 용어라 생각합니다. PAL은 주로 유럽에서 많이 사용되는데 50Hz 텔레비전 방송 규격입니다. SECAM도 50Hz니까 여기서는 그냥 PAL과 동급으로 취급하겠습니다. NTSC는 한국, 일본, 북미 등에서 사용하고 있는 60Hz(59.94) 규격입니다.

TV 방송하는데 50Hz냐 60Hz냐 이건 별로 문제가 안 됩니다. 그런데 영화에서는 문제가 됩니다. 영화는 23.976fps로 촬영됩니다. 이 영화를 TV로 방송하는 경우 어떻게 처리할까요?

PAL에선 단순히 영화 재생속도를 약간 빠르게 해버립니다. 원래 23.976fps인 영화를 25fps로 방송하는 것이죠. 그래서 유럽에선 영화를 TV로 방송하는 경우 러닝타임이 짧아지게 됩니다. TV 방송 뿐 아니라 DVD 역시 유럽에서 출시되는 타이틀은 PAL 규격으로 발매되기 때문에 속도가 약간 빨라지고 러닝타임이 짧아집니다. 이게 큰 차이가 아니라고 생각하실지도 모르겠지만 저는 이 PAL의 Speed Up이 영화를 제작한 감독의 의도를 훼손하는 방식이라 생각합니다.

NTSC 역시 영화에선 문제가 좀 있습니다. 23.976fps를 29.97fps로 맞추기 위해 텔레씬이라는 기법을 사용하는데 3:2 풀다운이라고도 합니다. 예전에 제가 추노 때문에 잠깐 언급했었죠. 1초에 24프레임짜리를 1초에 30프레임으로 재생하려면 4개의 프레임을 5개로 만들어야 합니다. 없는 프레임을 짜깁기로 만들어서 연속 동작이 어색하지 않도록 처리를 하지만 실상은 3:2 비율로 빨랐다 느렸다를 계속해서 반복합니다. 다만 워낙 짧은 시간에 계속해서 바뀌기 때문에 우리 눈에는 그다지 인식되지 못할 뿐입니다. 아무튼 이 NTSC에서의 텔레씬 기법은 비록 3:2로 왔다갔다 속도로 재생되긴 하지만 어쨌든 원래 영화의 재생속도를 왜곡하지는 않습니다. 동일한 러닝타임으로 진행됩니다.

이 글에서 다루는 내용은 유럽 방송을 녹화한 영화 ts 소스를 인코딩할 때 영상을 23.976fps로 인코딩한 다음 음성을 먹싱할 때 23.976fps에 맞게 재생 속도를 느리게 하는 방법입니다. 매우 간단합니다. 아 그리고 이건 mkv에만 해당합니다.

예제 소스는 스웨덴의 CANAL+ FILM HD에서 방송한 The Pacific 1부입니다. 원래 HBO에서 23.976fps로 제작했지만 유럽에선 25fps로 방송되었죠. 밴드 오브 브라더스의 후속작으로 기대를 많이 모았지만 스타일 자체가 많이 달라서 호불호가 갈렸던 작품입니다. 저는 개인적으로 BOB가 더 좋았습니다.



보시다시피 위 파일은 25fps입니다. 이걸 720p mkv 23.976fps로 인코딩했다고 가정하겠습니다. 저는 지금 당장 인코딩을 할 수 없으니 그냥 eac3to로 fps만 바꿔서 mkv로 리먹스 하겠습니다. eac3to로 FPS를 변경하는 방법은 -changeto23.976 이런 식으로 옵션을 붙여주시면 됩니다.



보시다시피 23.976fps로 잘 만들어 졌습니다. 재생시간을 보시면 원래는 52분 38초였는데 54분 33초로 늘어난 것을 볼 수 있죠? 자 이렇게 영상은 인코딩을 잘 했다고 치고, 이제 음성은 어떻게 하느냐? 만약 이게 영화라면 NTSC로 발매된 DVD가 있을 테니 그 음성을 사용하면 되겠습니다. 하지만 유일하게 존재하는 소스가 PAL 밖에 없다면 어쩔 수 없이 음성은 mkv의 타임코드를 이용하여 재생시간을 약간 늘여줘야 합니다.

방법은 매우 간단합니다. mkvmerge GUI로 먹싱하실 때 음성을 선택하고 Format specific options 탭에서 Stretch by 부분에 25025/24000을 입력해주시면 됩니다. 물론 꼭 저대로 입력할 필요는 없고 예를 들어 25.025/24 이렇게 넣어도 되고 아니면 25/23.976 이렇게 넣어도 됩니다. 25와 24/1.001의 비율만큼 음성의 재생속도를 늦춰주는 것입니다.




위 예는 제가 영상을 이미 23.976fps로 변환했기 때문에 음성만 저렇게 처리해주면 되는 것이고, 만약 현재 영상과 음성 모두 PAL로 인코딩된 파일을 가지고 있다면 영상에도 아래 스샷처럼 FPS를 지정해주면 됩니다.




어렵지 않죠? 뭐 어렵지는 않지만 어차피 이런 내용은 워낙 소수 분들에게만 필요하거나 이해될 내용이니 그냥 저런 것도 있구나 생각하고 가볍게 넘기시면 되겠습니다.
신고
Share
  1. ㅁㄴㅇㄹ
    2010.09.09 08:13 신고

    이글을 보니 어릴적에 TV-OUT 해본다고 설정 만지다가 NTSC를 PAL로 바꿨더니 갑자기 검은줄만 화면에 떠서 컴퓨터 망가진줄알고 설레발친 기억이 나네요 ㅎㅎ

    • BlogIcon snpbox
      2010.09.09 14:47 신고
      수정 및 삭제

      님 그냥 고정닉 하나 만드시죠 ^^

    • ㅁㄴㅇㄹ
      2010.09.09 15:16 신고
      수정 및 삭제

      스누피님 왜안초대장요?

    • BlogIcon snpbox
      2010.09.09 15:18 신고
      수정 및 삭제

      초대장 드려요? 안그래도 지난번에 드린 분들 중 2명은 블로그 개설을 안 했네요. 초대장 회수해야지 ㅡㅡ^

      필요하심 메일주소 남겨주세요.

  2. 드로이얀7(이준호)
    2010.09.09 09:47 신고

    Reclock이라고 그걸 런타임에서 해주는 녀석도 나왔죠.

    http://forum.slysoft.컴/forumdisplay.php?f=85
    (컴--->com 바꿔서 들어가 보세요. 파코즈 말고도 티스토리에서 차단한 곳이 많은 듯...)

    http://www.free-codecs.컴/download/ReClock_DirectShow_Filter.htm
    "The purpose of ReClock is to definitely get rid of jerky playback of AVI and MPEG material on a PC (or a PC connected to a TV). It's a DirectShow filter which is loaded in place of the default directsound audio renderer.

    It provides a new reference clock that is locked to the video card hardware clock, in order to ensure that frames are played at the exact speed of what is expected by the video card vertical sync.
    ReClock also provides a frame rate adaptator for media files that do not match a multiple of the video card refresh rate (ex: playback of 23,976fps IVTC NTSC on a PAL TV).

    Finally it is an audio renderer with hardware or software rate adaptation in real-time, multi-channel audio, and dynamic range compression capabilities."

    동영상 재생기에서 WASAPI 단독모드 쓰는 용도로도 쓸 수 있고요.
    http://www.parkoz.컴/zboard/view.php?id=dm_audio_qna&no=17796
    http://www.parkoz.컴/zboard/view.php?id=my_tips&no=13896

    • BlogIcon snpbox
      2010.09.09 14:59 신고
      수정 및 삭제

      준호님 2008 R2에 게임 추가하는거 아래 글 봤는데 중간에 첨부파일이 오류나서 더이상 못해봤습니다.

      http://www.win2008workstation.com/forum/viewtopic.php?f=25&t=928

      PE에 WOW64 문제는 제 능력 밖이구요 ㅋ

  3. ShadowBirds
    2010.09.09 11:41 신고

    인코딩쪽에도 관심이 많으신것 같은데 어느용도로 쓰시는지 궁굼합니다. ^^

    • BlogIcon snpbox
      2010.09.09 15:13 신고
      수정 및 삭제

      인코딩은 제가 윈도우에 관심갖기 전부터 관심가졌던 영역입니다.

      하드웨어 => 오버클럭 => 인코딩 => 윈도우 => 주식 => 블로그

      그냥 개인 소장 용도로 인코딩하고 있습니다.

  4. 아이러브
    2010.09.09 16:11 신고

    글 잘 보았습니다. 인코딩 쪽도 잘 아시네요. ^^

  5. 사무스
    2010.09.09 16:14 신고

    윈도우 질문 좀 드릴게요 ^^

    VHD자동교체 관련 질문인데요

    bcdedit /create /d "VHD 파일 교체하기" /application OSLOADER
    이걸 하면 식별자가 나온다고 하는데
    그 식별자를 혹시 변수등을 이용해서 저장시키고


    bcdedit /set {ae48570b-e279-11de-97e7-a1cf7efb0803} device ramdisk=[D:]\boot\copy.wim,{ramdiskoptions}
    bcdedit /set {ae48570b-e279-11de-97e7-a1cf7efb0803} osdevice ramdisk=[D:]\boot\copy.wim,{ramdiskoptions}
    .
    .
    위 명령줄의 식별자 부분을 해당변수로 대체하는 방법이 가능할까요?
    그게 불가능하다면 혹시 식별자만 따로 txt 로 출력시켜서
    txt에서 식별자를 읽어와서 대체를 한다던가?

    힘들까요?

    • BlogIcon snpbox
      2010.09.09 16:48 신고
      수정 및 삭제

      제가 블로그에서 자주 다뤘던 내용인데 FOR 구문을 이용하시면 됩니다.

      bcdedit /create /d "VHD 파일 교체하기" /application OSLOADER > GUID.TXT

      텍스트로 출력하시고

      for /f "tokens=1" %a in (GUID.TXT) do set GUID=%a

      하시면 텍스트의 첫번째 토큰 {GUID} 부분을 %GUID% 로 지정할 수 있습니다. 한글판에선 첫번째 토큰이 GUID로 반환되는데 영문판에선 3번째 토큰이 반환됩니다. 따라서 영문판에선 tokens=3 으로 지정하시면 됩니다. FOR 구문을 배치파일에 넣을 경우 %%a 이렇게 %를 2개 붙여주셔야 합니다.

      직접 스크립트를 보시면 이해가 되실 것입니다.
      아래 글은 PE 파일과 boot.sdi가 루트에 있는 경우에 해당하고

      http://snoopybox.co.kr/1170

      아래 글은 VHD를 등록시키는건데 경로를 직접 받아서 작업합니다.

      http://snoopybox.co.kr/1361

      제가 작성한 초보자용 FOR 구문 가이드를 보시면 도움이 되실 것입니다.

      http://snoopybox.co.kr/1366

    • 사무스
      2010.09.09 17:19 신고
      수정 및 삭제

      ^^ 아 네 감사합니다

  6. 여니
    2010.09.09 17:40 신고

    스누피님 강좌 한번도 결석 한적없음.
    글만 처음..
    건강하세요^^*

  7. 사무스
    2010.09.10 12:22 신고

    잘 되는듯 하다 또 막혀서 질문드려요 ㅎ;

    http://snoopybox.co.kr/1170

    이 주소의 강좌가 pe를 부팅메뉴에 등록시키는건데요

    :_RAMDISK
    bcdedit /create {ramdiskoptions} /d "Ramdisk 옵션"
    bcdedit /deletevalue {ramdiskoptions} description
    bcdedit /set {ramdiskoptions} ramdisksdidevice partition=%SRC%
    bcdedit /set {ramdiskoptions} ramdisksdipath \boot.sdi
    bcdedit /create /d "PE로 부팅하기" /application OSLOADER > GUIDTEMP.TXT

    :_KOR
    for /F "tokens=1" %%B in (GUIDTEMP.TXT) do (
    bcdedit /set %%B device ramdisk=[%SRC%]\boot.wim,{ramdiskoptions}
    if errorlevel 1 goto _ENG
    bcdedit /set %%B osdevice ramdisk=[%SRC%]\boot.wim,{ramdiskoptions}
    bcdedit /set %%B path \windows\system32\winload.exe
    bcdedit /set %%B systemroot \windows
    bcdedit /set %%B winpe yes
    bcdedit /set %%B detecthal yes
    bcdedit /set %%B ems yes
    bcdedit /displayorder %%B /addlast
    bcdedit /timeout 5
    del GUIDTEMP.TXT
    goto _EXIT
    )

    이렇게 나와 있거든요.
    기존의 vhd 교체랑 스크립트를 비교해 봐도 거의 다른점이 없는것 같고
    단지,

    dism /mount-wim /wimfile:e:\boot.wim /index:2 /mountdir:e:\mount
    setup.exe를 복사
    dism /unmount-wim /mountdir:e:\mount /commit

    이 부분이 먼저 선행이 되는 차이점인데
    제가 짠 스크립트를 exe로 만들고선 setup파일로 교체로
    boot.wim에 심어 놨거든요

    그렇다면 부팅메뉴에서 선택을 하는데 pe까지는 실행이 되는데
    제가 짠 스크립트는 실행이 안되네요;
    setup.exe가 자동실행이 안되었다는 이야기인데;

    setup.exe를 자동으로 실행시키는데 관여하는게 다른 무언가가 또 있는지요?
    분명 윈도우상에서 그 스크립트를 실행했을때는 전혀 문제가 없었습니다;
    마운트해서 교체까지 했는데 왜 pe까지만 가고 그 파일이 실행이 안되는건지
    난감하네요; 힌트같은게 없을까요?

    • BlogIcon snpbox
      2010.09.10 15:53 신고
      수정 및 삭제

      본문과 무관한 내용을 그것도 장문으로 이렇게 질문하시면 다른 사람들 보기에도 안 좋습니다.

      그리고 저는 질문에 답변하려고 블로깅 하는 것이 아닙니다. 사무스님 입장에선 두번째 질문일 뿐이겠지만 저는 그동안 수천건의 질문을 받아왔고 매일 십여건의 질문을 받습니다. 질문하기 전에 한번 더 검색해보고 한번 더 고민해보기 바랍니다.


      setup.exe 파일을 교체하기 전에 원래 있던 setup.exe 파일을 삭제하세요. 그냥 덮어씌우는 경우 오류가 발생할 수 있습니다.

      그리고 혹시 64비트 PE로 작업했다면 당연히 안 됩니다. 배치파일은 32비트로 컴파일 했을 테니까요.

  8. feynman
    2010.10.25 04:11 신고

    매우 유익하고 좋은 정보 고맙습니다.
    스누피님으로부터 언제나 좋은 정보 배웁니다.

  9. BlogIcon motherloverockets
    2010.11.29 21:27 신고

    PAL하고 NTSC가 궁금해서 검색 타다가 들어왔네요.
    좋은 정보 감사합니다.

  10. ㅇㅇ
    2016.06.23 20:24 신고

    stretch by 부분에 영상 재생시간과 음성 재생시간을 분수로 넣어도 되더군요. 단 mediainfo 등의 프로그램으로 ms단위로 정확하게 측정해야죠.