Monthly Archives: March 2009

ffmpeg / mencoder 이용해서 동영상에 로고 넣기

동영상에 이미지로고를 삽입할 일이 있어서 ffmpeg와 mencoder를 이용해서 테스트해봤습니다.

ffmpeg에서는 간단합니다. -vhook 옵션을 사용하면 됩니다. vhook 플러그인중에 imlib2를 사용하면 됩니다. 하지만 최근 SVN에서는 vhook 옵션이 제거되었습니다. libavfilter라는 새로운 필터링 라이브러리로 갈아타기 위해서이지만 아직은 쓸수 있는 플러그인이 없어서 SVN에 있는 버전은 로고를 삽입할수 없습니다. x 좌표, y 좌표 지정하는 곳에 expression을 사용할수 있어서 위치 조절등을 비교적 쉽게 할수 있습니다. 자세한 사용법은 http://windforce.ellil.net/d/ffmpeg/hooks.html 을 참고하세요.

$ ffmpeg -sameq -i input.avi -vhook ‘vhook/imlib2.so -x 10 -y 10 -i logo.png’ output.avi

mencoder에서는 FIFO라는 기술로 개발되었기 때문에 유닉스 계열에서만 정상적으로 동작합니다. png 포멧을 바로 지원하지 않기 때문에 변환을 위해서 ImageMagick이 필요합니다. 웹상에서 찾은 예제들은 RGB24 포맷을 사용하도록 되어 있어서 투명한 로고를 지원하지 않았었는데 ImageMagick에서 변환할때 RGBA로 변환하면 투명한 로고가 지원됩니다. bit depth는 8비트만 지원하므로 16비트로 되어 있으면 제대로 동작하지 않습니다.

$ convert logo.png -depth 8 logo.rgba
$ 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으로 작업했습니다. 동영상의 소스가 여러곳이고 크기, 파일포맷도 여러가지이고 결정적으로 상하좌우 공백이 같이 인코딩되어 있는 경우가 있어서 수동인코딩도 고려했었는데… 동영상 인코딩을 완전 자동화할수 있을거라 기대하고 있습니다 :)

AutoIT MS워드 자동화

전에 AutoIT을 통한 자동화에 대한 글을 쓴적이 있는데, 얼마전에 자동화할때 MS워드에서 정보를 추출할 일이 있어서 AutoIT에 포함된 워드 모듈을 써볼 기회가 있었습니다. AutoIT에서 제공하는 워드 함수에 대한 문서만으로는 자동화하기는 부족하더군요. MSDN을 참고해서 워드의 객체 모델을 어느정도 이해하시고 Range 객초 참고하시면 큰 도움이 될듯합니다. MSDN이 Visual Basic 위주로 되어 있지만, 문법은 동일하게 쓰면 됩니다.

아래 예제 보시면 어느정도 감이 오실듯하네요.

#include <word.au3>

; 화면에 보이지 않고 포커스 안가져가도록 인자 전달
$oWordApp = _WordCreate(“”, 0, 0, 0)

; test.doc 문서 열기
$doc = _WordDocOpen($oWordApp, “test.doc”)

; 문단 객체 가져오기
$paragraph = $doc.Paragraphs
 
; 첫번째 문단 텍스트 가져오기 (텍스트만)
$paragraph1text = $paragraph(1).Range.Text

; 두번째 문단 클리보드에 복사 (포맷,링크,그림등 포함)
$paragraph(2).Range.Copy

; 세번째 문단부터 끝까지 클립보드에 복사
$doc.Range($paragraph(3).Range.Start).Copy

; 세번째 문단부터 다섯번째 문단까지 텍스트 가져오기

$paragraph3to5text = $doc.Range($paragraph(3).Range.Start, $paragraph(5).Range.End).Text

; 문서내 모든 링크 가져와서 출력하고 다른 주소로 변경
For $hyper in $doc.HyperLinks
    ConsoleWrite(“link=” & $hyper.Address & @CRLF) ; 링크 출력
    $hyper.Address = “http://mix1009.net” ; 모든 링크 바꾸기 —
Next

CentOS에서 최신버전 lighttpd rpm 만들기

CentOS나 RHEL에서 최신 버전 lighttpd rpm 만드는 방법입니다.
이전 버전의 src rpm을 받아서 아래와 같이 src rpm 최신버전으로 제작할수 있습니다.

# wget http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# rpm -i http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# cd /usr/src/redhat/SPECS
# sed -i ‘s/1\.4\.13/1\.4\.22/g’ lighttpd.spec

sed로 lighttpd.spec 파일에서 1.4.13을 찾아서 1.4.22(현재 최신 버전)으로 변경합니다. 일반 에디터로 편집하셔도 됩니다. 파일 내용도 한번 확인해보시면 도움이 될듯하네요.

lighttpd 소스를 받습니다.

# cd /usr/src/redhat/SOURCES
# wget http://www.lighttpd.net/download/lighttpd-1.4.22.tar.gz

이제 rpm만 만들면 됩니다. src rpm은 아래처럼 만듭니다.

# cd /usr/src/redhat/SPECS
# rpmbuild -bs lighttpd.spec

이렇게 하면 /usr/src/redhat/SRPMS 에 src rpm이 만들어집니다.

아래처럼 바이너리 rpm을 제작할수 있습니다. ssl을 사용할 수 있도록 옵션을 추가적으로 전달했습니다. spec 파일 보면 어떤 옵션이 있는지 확인할수 있습니다.

# cd /usr/src/redhat/SPECS

# rpmbuild -bb lighttpd.spec -with ssl

이렇게하면 시스템에 따라 /usr/src/redhat/RPMS/{x86_64, i386} 에 바이너리 rpm 파일이 생성됩니다.

rpmbuild 할때 오류나면 yum으로 필요한 패키지 설치하면 됩니다. (yum update openssl-devel …)

이제 필요한곳에 rpm을 설치하고 재시작 하면 됩니다~

# rpm -e lighttpd      (이전 버전 제거)
# cd /usr/src/redhat/RPMS/x86_64
# rpm -i lighttpd-1.4.22-1.x86_64.rpm
# /etc/init.d/lighttpd start