동영상에 이미지로고를 삽입할 일이 있어서 ffmpeg와 mencoder를 이용해서 테스트해봤습니다.
ffmpeg에서는 간단합니다. -vhook 옵션을 사용하면 됩니다. vhook 플러그인중에 imlib2를 사용하면 됩니다. 하지만 최근 SVN에서는 vhook 옵션이 제거되었습니다. libavfilter라는 새로운 필터링 라이브러리로 갈아타기 위해서이지만 아직은 쓸수 있는 플러그인이 없어서 SVN에 있는 버전은 로고를 삽입할수 없습니다. x 좌표, y 좌표 지정하는 곳에 expression을 사용할수 있어서 위치 조절등을 비교적 쉽게 할수 있습니다. 자세한 사용법은 http://windforce.ellil.net/d/ffmpeg/hooks.html 을 참고하세요.
mencoder에서는 FIFO라는 기술로 개발되었기 때문에 유닉스 계열에서만 정상적으로 동작합니다. png 포멧을 바로 지원하지 않기 때문에 변환을 위해서 ImageMagick이 필요합니다. 웹상에서 찾은 예제들은 RGB24 포맷을 사용하도록 되어 있어서 투명한 로고를 지원하지 않았었는데 ImageMagick에서 변환할때 RGBA로 변환하면 투명한 로고가 지원됩니다. bit depth는 8비트만 지원하므로 16비트로 되어 있으면 제대로 동작하지 않습니다.
$ mkfifo bmovl.fifo
$ echo “RGBA32 80 30 10 10 0 0” > bmovl.fifo; cat logo.rgba > bmovl.fifo
다른 terminal에서 실행
$ mencoder input.avi -o output.avi -vf bmovl=0:0:bmovl.fifo … {encoding options}
위에서 로고의 크기는 80×30이고 10,10 위치에 출력하도록 설정했습니다. logo.rgba포맷은 raw 이미지 포맷으로 Red Greed Blue Alpha 8비트씩 하나의 픽셀이 32비트로 구성되어 있습니다. FIFO를 통해서 인코딩중에 지속적으로 명령을 전달할수 있으므로 로고를 바꾼다던지 위치를 바꾸는게 가능은 합니다. 하지만 프로그래밍이 필요하고 원하는 시간에 동기화하는게 쉬운 일은 아닙니다.
mencoder와 ImageMagick를 이용해서 들어온 동영상에서 screenshot을 여러개 받은후 가장 밝은 이미지를 찾고, 이 이미지를 autocrop한 다음에 인코딩하도록 python으로 작업했습니다. 동영상의 소스가 여러곳이고 크기, 파일포맷도 여러가지이고 결정적으로 상하좌우 공백이 같이 인코딩되어 있는 경우가 있어서 수동인코딩도 고려했었는데… 동영상 인코딩을 완전 자동화할수 있을거라 기대하고 있습니다 🙂