웹사이트 상에서 미리 제작된 영상 템플릿을 제공하고 이에 맞게 사용자가 이미지나 텍스트만 바꿀 수 있도록 툴을 제공한 후 사용자가 만들어낸 데이터 모델을 기반으로 영상을 만들어내는 video generator 기능을 구현하려면 어떻게 해야할까?
일단 웹사이트 프론트엔드에서 이미지를 업로드하고, 텍스트를 입력하고 배치하는 일들은 일반적인 웹사이트 제작에 사용되는 Vue.js나 React 등을 사용해서 빠르게 만들 수 있다. 이렇게 사용자에게 영상을 구성할 수 있는 툴을 제공하고, 해당 툴을 이용해서 생성된 모델을 백엔드 서버에 저장하는 일까지는 일반적인 웹 개발 방식을 이용하면 어렵지 않게 만들어 낼 수 있다.
그렇다면 해당 모델 데이터를 이용해서 실제 동영상을 만들어 내려면 어떻게 하면 될까? 좀더 상세하게 요구사항을 분석해보자.
ffmpeg 만 이용해서는 단순히 단일 트랙으로 이미지들의 슬라이드 쇼만 가능한 한계점이 존재하기때문에 위 조건을 만족시키지 못했다. 따라서 이를 만족시키는 여러 프로그램들을 찾아보다가 오픈소스로 공개된 MLT framework 기반의 영상 편집 프로그램인 샷컷(Shotcut)을 선택하게 되었다. Shotcut의 경우 템플릿 파일이 XML기반으로 저장되어 편집이 간단하고, 멀티플랫폼에서 모두 실행되며, GUI, CLI 툴도 모두 지원하고 있어서 위에서 제시한 요구사항들을 모두 만족시킨다.
Ubuntu 16.04 기준으로 샷컷(Shotcut)을 설치하는 방법을 설명하면 다음과 같다.
Shotcut에서 참고하고있는 공유 라이브러리(shared library)들을 미리 설치해준다.
sudo apt-get update
sudo apt-get install \
libsdl2.2 \
libgtk2.0-0 \
libgl1-mesa-glx \
libxml-libxslt-perl \
libgomp1 \
libsamplerate0 \
libjack0 \
libltdl7 \
libtheora0 \
libxv1 \
libxcb-shape0
Ubuntu 16.04의 경우 이미 snap 이 설치되어 있기때문에 아래 명령어를 이용하면 Shotcut 어플리케이션이 바로 설치가 완료된다.
sudo snap install shotcut --classic
위 명령어를 실행하면 Shotcut 어플리케이션이 /snap/shotcut/current/Shotcut.app 경로에 설치된다.
Linux에 X Windows 기반의UI가 존재한다면, 설치된 shotcut을 실행하면 GUI기반의 편집도 가능하다. GUI 툴을 이용해서 템플릿을 만드는 것은 꼭 리눅스에서 할 필요는 없으니 맥이나 윈도우에서 해도 된다.
하지만 이글의 목적은 CLI 기반으로 동영상 생성을 자동화를 하는것이기 때문에 shotcut에 포함된 CLI tool 중에 하나인 melt 명령어를 이용하여 GUI없이 template.mlt 파일로 부터 동영상을 만들어 내는 방법에 집중할 것이다.
참고: snap을 통해 설치된 melt 명령어의 경로는 다음과 같다.
/snap/shotcut/current/Shotcut.app/melt
mlt 파일에서 사용되는 주요 태그들을 아래와같이 간단히 정리해 보았다.
producer: 이미지, 컬러 등 각 트랙안에 배치되는 "리소스" 라고 보면 된다.
filter가 이곳에 child 태그로 추가된다.playlist: 타임라인에 배치되는 "트랙"을 의미한다
entry 태그에는 연결된 producer를 지정하게되고 트랙 안에서 몇초부터 몇초까지 지속되는지를 명시한다.tractor: 트랙들간의 레이어 순서와 mixing 방식을 정의한다.아래 명령어를 통해 template.mlt 파일을 동영상으로 인코딩 할 수 있다.
/snap/shotcut/current/Shotcut.app/melt -verbose -progress2 -abort ~/template.mlt
맥 OS의 경우 아래 경로에 실행파일이 존재한다.
/Applications/Shotcut.app/Contents/MacOS/melt
단순하게 mlt파일을 매개변수로 넣을경우 GUI mlt viewer로 영상이 렌더링된다. 실제 영상 파일로 출력하려면 mlt파일을 열어서 profile 태그 다음에 consumer 태그를 넣어주어야 한다. 다음 내용을 참고하자. consumer 태그의 attribute 설정값 들은 Shotcut GUI 어플리케이션에서 미리 설정해 둔 값으로 넣으면 되는데 이 값을 찾는 트릭이 존재한다.
<consumer mlt_service="avformat" aspect="1" preset="fast" f="mp4" g="15" bf="2" vcodec="libx264" ab="384k" rescale="bilinear" crf="21" target="/Users/yjiq150/Movies/untitled.mp4" height="640" deinterlace_method="yadif" r="30" progressive="1" acodec="aac" ar="48000" width="640" real_time="-4" threads="0" movflags="+faststart" top_field_first="2"/>
먼저 Shotcut GUI 어플리케이션에서 원하는 export옵션을 설정한 후, 실제로 export를 실행한다. 그 후에 View 메뉴의 "Application Log" 항목을 열어서 보면 다음과 같이 파일로 영상 렌더링을 하는 log를 볼 수 있다. 여기에 나오는 "/var/folders/zn/dgry6c5s27zb6ry488lhjdz80000gn/T/shotcut-fs8617.mlt" 이 mlt 파일이 실제 파일로 영상 렌더링을 지시하는 임시 파일인데, 이 파일을 열어서 살펴보면 우리가 설정했던 export 옵션을 기반으로 생성된 consumer 태그가 존재하는것을 확인 할 수 있으니 이 값을 복사해서 사용하면 된다.
[Debug ] <MeltJob::start> "/Applications/Shotcut.app/Contents/MacOS/melt" ("-verbose", "-progress2", "-abort", "/var/folders/zn/dgry6c5s27zb6ry488lhjdz80000gn/T/shotcut-fs8617.mlt"
Shotcut에서 text filter에 한글 text 입력을 해놓은 경우 인코딩을 해보면 글자가 깨지는 경우가 있다. 이는 text filter에 지정한 폰트가 우분투에 설치되어 있지 않거나, 지정한 폰트가 한글을 지원하지 않는 경우에 발생한다. 이를 해결하기 위해 아래 안내에 따라 한글 폰트를 따로 설치해주면 된다.
우분투에서는 아래와 같은 경로에 대해서 폰트를 자동으로 읽어들인다. (해당 설정값을 좀 더 자세히 보고 싶으면 /etc/fonts/fonts.conf 파일을 열어서 살펴보면 된다.)
위 경로중 원하는곳에 폰트파일을 복사한다.
아래 명령어를 실행하여 시스템이 폰트를 로딩하도록 한다.
fc-cache -v
-v 옵션을 주면 구체적으로 OS에서 규칙으로 정해진 폴더 몇몇 곳을 스캔하여 읽어들이는 것을 확인 할 수 있다.