지난 몇 주 전에 우리는 VirtualDub 필터를 사용해 동영상 크기를 조절하는 방법을 배웠습니다. 미적인 목적이나 출력 파일 용량을 줄이고 싶은 욕구 외에는 동영상 리사이징이 그렇게 중요해 보이지 않을 수 있습니다. 하지만 '총알 시간(bullet-time)' 슬로우 모션 영상 제작처럼 아주 특별한 요구 사항이 생기고, 해당 작업을 수행하는 소프트웨어가 특정 형식과 해상도를 요구한다면 어떻게 될까요?
걱정하지 마세요. 지난 튜토리얼에서 이미 그 장애물을 넘었습니다. 오늘은 슬로우 모션 동영상을 만드는 방법을 알려드리겠습니다. 여기 VirtualDub이 있고, 또 하나의 훌륭한 프로그램인 AviSynth도 함께 소개합니다. AviSynth는 동영상 후반 작업을 위한 강력한 유틸리티입니다. 별도의 GUI(프런트엔드)가 없어서 명령줄과 스크립트를 다뤄야 한다는 점이 다소 부담스러울 수 있지만, 걱정하지 마세요. 최대한 쉽게 설명해 드리겠습니다.
AviSynth 설치, 준비 및 설정
VirtualDub을 사용하기 전에 먼저 AviSynth를 설정해야 합니다. 다운로드 후 설치하는 과정은 매우 간단합니다. 다만 기본 패키지에는 포함되어 있지 않은 mvtools라는 추가 플러그인이 필요합니다. 이 작업까지 완료하면 AviSynth를 사용할 준비가 끝납니다.
AviSynth 사용하기
GUI가 없으니 클릭 몇 번으로 끝나는 쉬운 방법은 없습니다. 그래도 명령줄을 두려워할 필요는 없습니다. 텍스트 편집기를 열고 직접 명령을 작성하거나, 웹에서 공개된 스크립트를 찾아 복사해 활용하면 됩니다. 저는 전문가는 아니지만 코드를 읽을 줄 알고, 검색으로 필요한 정보를 찾아 해결할 줄 압니다.
Nerds Central에서 슬로우 모션 스크립트를 찾아 제 용도에 맞게 수정했습니다. 원저자가 스크립트의 동작 원리를 자세히 설명하고 있으므로, 여기서 명령어를 하나씩 짚어가며 설명하지는 않겠습니다. 다만 기억할 점은, AviSynth는 자체 문법을 갖춘 사실상의 프로그래밍 언어라는 것입니다. 하나를 익혀두면 다른 곳에도 응용할 수 있습니다.
다음은 위 예시와 거의 동일한 실제 작성 예입니다:
LoadPlugin("Path to mvtools.dll")
source=AVISource("Path to source.avi",false)
oSource=source
source=ConvertToYV12(source)
source=AssumeFPS(source,25)
backward_vec=source.MVAnalyse(isb=true,truemotion=true,pel=2,idx=1)
forward_vec=source.MVAnalyse(isb=false,truemotion=true,pel=2,idx=1)
cropped=source.crop(4,4,-4,-4) # by half of block size 8
backward_vec2=cropped.MVAnalyse(isb=true,truemotion=true,pel=2,idx=2)
forward_vec2=cropped.MVAnalyse(isb=false,truemotion=true,pel=2,idx=2)
fSource=source.MVFlowFps2(backward_vec,forward_vec,
backward_vec2,forward_vec2,num=250,idx=1,idx2=2)
fSource=AssumeFPS(fSource,25)
return fSource
하지만 몇 가지 주의해야 할 사항이 있습니다.
먼저 mvtools.dll 경로와 소스 파일 경로를 정확하게 지정해야 합니다. 두 번째로, 소스를 YV12 형식으로 변환하는 명령이 있는데, 파일이 이미 올바른 형식이라면 이 줄을 수정하거나 삭제해도 됩니다. VirtualDub을 이용해 변환하는 방법도 있습니다.
source=ConvertToYV12(source)
그렇다면 YV12가 정확히 무엇이고, 왜 필요한 걸까요? 사실 꼭 필수는 아니지만 동영상 처리에는 유용한 형식입니다. 전문 용어로 설명하자면, YV12는 플래너(planar) 형식으로, 각 이미지의 모든 픽셀에 대한 루마(luma) 데이터가 연속적으로 저장되고 그 뒤에 크로마(chroma) 데이터가 이어지는 구조입니다. 이는 이미지 처리 기법에 이상적입니다. 자, 이제 이 설명은 잊어버려도 됩니다.
YV12를 지원하는 형식에 대한 자세한 정보는 AviSynth FAQ를 참고하면 됩니다. 일반적으로 XviD 코덱으로 인코딩된 MPEG-4 파일이라면 대부분 문제없이 작동합니다.
만약 이 부분을 잘못 설정하면, VirtualDub에서 스크립트를 로드하려는 순간 다음과 같은 오류 메시지를 만나게 됩니다. 정확한 로드 방법은 잠시 후 살펴보겠습니다.
다음은 소스에 적용하는 AssumeFPS입니다. 적절한 프레임레이트를 미리 설정해 두면 감으로 맞추는 시행착오 없이 최상의 결과물을 얻을 수 있습니다. 덕분에 프레임레이트를 몇 번이고 올렸다 내렸다 하는 반복 작업 없이도, 처음 의도한 대로 출력 동영상을 만들 수 있습니다.
크롭핑(Cropping)
이 부분은 다소 까다롭습니다. 동영상 파일의 가로 픽셀 수가 4로 나누어떨어지지 않으면, 스크립트를 로드할 때 VirtualDub이 산술 연산 관련 오류를 내뱉습니다.
스크립트에서 cropped 매개변수 줄을 주석 처리하는 방법도 있고, 어쩌면 그대로 작동할 수도 있습니다. 하지만 이 경우 스크립트의 논리가 달라지므로, 정의되지 않은 변수가 남지 않도록 반드시 확인해야 합니다.
더 좋은 방법은 VirtualDub의 resize 필터를 사용해 동영상 크기를 미리 조정하는 것입니다! 바로 지난 튜토리얼에서 배운 그 기능입니다. 이제 왜 그것을 먼저 배웠는지 아시겠죠?
MVFlowFPS2 매개변수는 슬로우 모션 동영상이 가질 프레임 수를 결정합니다. 다만 실제 슬로우 배율은 출력 프레임레이트에 따라 달라집니다. 따라서 마지막으로 출력 쪽의 AssumeFPS 값에 주목하세요. 이 값이 동영상의 재생 속도뿐 아니라 길이와 용량까지 최종적으로 좌우합니다. 이 매개변수를 자유롭게 조정하면서 최상의 결과를 찾아보세요.
fSource=AssumeFPS(fSource,25)
VirtualDub에서 스크립트 불러오기
사실 위에서 언급한 오류들은 텍스트 파일을 .avs 확장자로 저장한 뒤, VirtualDub에서 일반 동영상 파일을 열듯이 열어보기 전까지는 나타나지 않습니다. 오류가 없다면 동영상이 정상적으로 로드되며, 일정 배율만큼 프레임이 삽입됩니다. 위 예시는 x10 배율을 적용한 것이지만, FPS 값을 조정해 x2, x5 등 원하는 배율로 얼마든지 변경할 수 있습니다.
최종 결과물
AviSynth로 작업한 최종 결과물은 YouTube에서 확인할 수 있습니다. 링크 하나와 둘을 참고해 직접 방문하여 품질을 확인해 보세요. 이 동영상들이 소개된 인테리어 디자인 갤러리도 함께 살펴보시면 재미있을 것입니다.
동영상 가장자리에 약간의 흐림 현상이 보일 겁니다. 이는 프레임 간 보간(interpolation) 때문입니다. 원본 녹화는 개별 카메라 프레임들을 초당 25프레임으로 리샘플링한 뒤 10배 느리게 재생한 것입니다. 즉, 소프트웨어가 프레임 사이의 빈 공간을 약 250개 수준으로 채워 넣어야 하니 결코 간단한 작업이 아닙니다. 카메라 움직임이 있어 이미 자연스러운 흐림이 존재하는 동영상이라면 훨씬 더 좋은 결과를 얻을 수 있으며, 그런 경우 흐림은 오히려 자연스럽게 받아들여집니다.
그래도 꽤 쓸만한 결과라고 생각합니다. 무엇보다 이제 여러분도 만드는 법을 알게 되었으니까요.
결론
자, 또 하나의 멀티미디어 튜토리얼이 완성되었습니다. 이제 여러분은 동영상 요리사가 된 셈입니다. 진지하게 말하자면, VirtualDub은 각종 필터를 포함해 미디어 파일 작업에 매우 강력하고 확장성이 뛰어난 도구입니다. 여기에 AviSynth를 결합하면 홈메이드 동영상에서 매트릭스 스타일, 혹은 존 우(John Woo) 영화 같은 백미의 액션 효과까지 연출해 이웃과 직장 동료들을 놀라게 할 수 있습니다.
AviSynth는 GUI가 없어 가장 쉬운 도구는 아니지만, 확실히 제 역할을 합니다. 기본적인 계층화 접근 방식만 기억하세요. 첫째, VirtualDub으로 1차 수정과 추가 처리, 트랜스코딩을 수행합니다. 둘째, 사용 가능한 필터로 추가 효과를 구현합니다. 마지막으로 서드파티 모듈로 마무리 손질을 합니다. 여기까지입니다. 즐겁게 활용해 보세요!