ffmpeg를 윈도우에서 쓰기 위해서는 소스를 직접 가져와서 컴파일을 해서 써야한다.
그런데 문제는 ffmpeg가 윈도우에서 컴파일을 하기 쉽게 구성되어있지 않은 점이다.

또한 ffmpeg 개발 팀 또한 윈도우에서 컴파일 하기 위해 가장 쉬운 방법인 visual studio를
지원하지 않으며 앞으로 지원할 계획도 없다고 4가지 없게 딱 잘라 말하고 있다.

그럼 어떻게 하면 윈도우에서 ffmpeg를 사용할 수 있느냐.....

다행이도 외국 횽아들이 미리 윈도우용으로 컴파일된 바이너리를 제공해주고 있다.
ffmpeg 공식사이트에서도 윈도우용 바이너리를 구하려면 아래 사이트로 가라고 하고 있다.


여기가면 윈도우용으로 빌드된 바이너리를 구할 수 있으며 어떤 라이브러리들이 추가로
포함되어있는지 알 수 있다. 친절하게 64비트용까지 제공하고 있으니 참으로 감사하다.

하지만 나같이 누가 주는 떡 넙죽 받아먹기 보다는 직접 만들어보기 위한 사람들을 위해
내가 현재 사용하고 있는 ffmpeg 빌드 환경과 옵션을 공개하고자 한다.

일단 환경은 아래와 같다.

OS : Fedora 15 32bit
Cross-compiler : mingw

cygwin이니 윈도우용 mingw도 있지만 ffmpeg 자체만 컴파일 한다면 무리 없이 되긴한다.
하지만 추가적으로 외부 라이브러리를 포함해서 컴파일을 하고자 한다면 윈도우에서 컴파일이
잘 안된다.

그냥 리눅스에서 윈도우용으로 크로스컴파일 하기를 추천한다.

리눅스를 깔 컴퓨터가 없다고? 요즘 vmware와 같은 가상화 솔루션이 많다.
어둠의 경로로도 많이 있으니 재주껏 설치하면 편하게 할 수 있다.

리눅스를 설치 했으면 크로스컴파일을 위한 mingw32를 설치해야한다. yum이나 apt로
재주껏 설치하면 된다.

아래는 ffmpeg와 기타 외부 라이브러리 컴파일 방법이다.

common
./configure --enable-static --disable-shared --host=i686-pc-mingw32 --prefix=/usr/i686-pc-mingw32/sys-root/mingw

frei0r
./configure --prefix=/usr/i686-pc-mingw32/sys-root/mingw

bzip2
make AR=i686-pc-mingw32-ar CC=i686-pc-mingw32-gcc RANLIB=i686-pc-mingw32-ranlib
make PREFIX=/usr/i686-pc-mingw32/sys-root/mingw install

rtmp
make SYS=mingw SHARED= CROSS_COMPILE=i686-pc-mingw32- INC=-I/usr/i686-pc-mingw32/sys-root/mingw/include
make prefix=/usr/i686-pc-mingw32/sys-root/mingw install
설치후 에러메시지는 무시

openssl
export AR=i686-pc-mingw32-ar; export CC=i686-pc-mingw32-gcc; export SYSTEM=MINGW32; ./config --prefix=/usr/i686-pc-mingw32/sys-root/mingw

libvpx
CROSS=i686-pc-mingw32- ./configure --target=x86-win32-gcc --prefix=/usr/i686-pc-mingw32/sys-root/mingw

x264
./configure --enable-static --host=i686-pc-mingw32 --prefix=/usr/i686-pc-mingw32/sys-root/mingw --cross-prefix=i686-pc-mingw32-

xavs
./configure --host=i686-pc-mingw32 --prefix=/usr/i686-pc-mingw32/sys-root/mingw --cross-prefix=i686-pc-mingw32-

xvid
./configure --host=i686-pc-mingw32 --prefix=/usr/i686-pc-mingw32/sys-root/mingw
make 후 설치 된 곳에서 아래 실행
rm xvidcore.dll
mv xvidcore.a libxvidcore.a

ffmpeg
./configure --prefix=/home/chadr/ffmpeg-cross/build --enable-postproc --cpu=i686 --disable-static --enable-shared --enable-gpl --enable-version3 --enable-runtime-cpudetect --enable-memalign-hack --enable-libvo-amrwbenc --enable-libvo-aacenc --enable-avisynth --enable-frei0r --enable-bzlib --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-librtmp --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxavs --enable-libxvid --enable-zlib --enable-libcelt --enable-cross-compile --cross-prefix=i686-pc-mingw32- --target-os=mingw32 --arch=x86 --extra-cflags="-DENOTSUP=95 -DENOBUFS=105 -I/usr/i686-pc-mingw32/sys-root/mingw/include -I/usr/i686-pc-mingw32/sys-root/mingw/include/freetype2 -I/usr/i686-pc-mingw32/sys-root/mingw/include/SDL" --extra-ldflags="-L/usr/i686-pc-mingw32/sys-root/mingw/lib" --extra-libs="-lssl -lcrypto -lws2_32 -lwinmm -lgdi32 -lorc-0.4 -lSDL -lpthread" --pkg-config=pkg-config


위에 --prefix=/usr/i686-pc-mingw32/sys-root/mingw 와 같이 설치 위치는 리눅스 배포판마다
다를 수 있으므로 본인이 스스로 확인 해야한다.

common이라고 써진 것은 위에 언급된 라이브러리가 아닌 라이브러리의 경우 common에 명시된
옵션으로 컴파일 하면 된다.

ffmpeg의 prefix 또한 자신이 설치하고자 한 위치로 적절히 변경 시켜줘야한다.

이 글을 쓴 시각까지 ffmpeg의 최신 버전은 위 옵션으로 전부다 컴파일이 성공했으니 참고바란다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/11/05 14:01 2011/11/05 14:01
안드로이드 클라이언트 제작을 위해 일단 ffmpeg를 안드로이드에서 사용하기 위해서
ndk로 컴파일을 하여 준비를 마쳤다.

ffmpeg를 ndk로 컴파일 하는 것이 제일 문제였는데 안드로이드펍에 올라온 글을 보고
쉽게 컴파일을 마칠 수 있었다.

다음은 구현할 기능을 리스트업 하고 설계에 들어가야겠다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/10/08 15:01 2011/10/08 15:01
오늘 ffmpeg 홈페이지에 가보니 현재 ffmpeg에서 사용하고 있는 지그재그 모양의 로고를 ffmpeg에서 쓰지 말라고하는 경고장이 날아왔다고 한다.

현재 로고는 ffmpeg의 fork인 libav에 속해있는 사람이 만든건데 그 사람이 ffmpeg에서 쓰지 말라고 했다고 한다.

15일이내에 로고 안내리면 법적대응에 들어가겠다고 하는데 어떻게 될지 참으로 궁금하다.

libav의 발생 배경은 아래 참고

March 15, 2011

FFmpeg has been forked by some developers after their attempted takeover[1] two months ago did not fully succeed. During these two months their repository was listed here as main FFmpeg repository. We corrected this now and list the actual main repository and theirs directly below. All improvements of their fork have been merged into the main repository already.

Sadly we lost a not so minor part of our infrastructure to the forking side. We are still in the process of recovering, but web, git and issue tracker are already replaced.

Readers who want to find out more about the recent happenings are encouraged to read through the archives of the FFmpeg development mailing list[2]. There was also a bit of coverage on some news sites like here [3].

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/05/31 13:31 2011/05/31 13:31
몇일전에 나온 fedora 15로 업그레이드를 했다.

preupgrade를 이용해서 처음 시도했을 때는 패키지를 모두 다운로드하고
리부팅 후 설치 도중에 openjpeg-devel 패키지를 못읽는다며 설치가 실패하더라.

그리고 리부팅하면 커널패닉....

vmware에서 돌리기 때문에 snapshot을 이용해서 다시 롤백 후 openjpeg-devel을 일단
제거하고 설치를 다시 했다.

그렇게 하니 잘 되더라.
그런데 한가지 문제는 vmware tools가 실행이 안된다.

이 문제는 vmware가 업데이트 될 때까지 기다려야할 것 같다.

fedora 15에서 trac 0.12로 바뀌었다.
드디어 0.11을 버리는구나..
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/05/29 15:56 2011/05/29 15:56
오늘 한글이름으로 된 파일이 포함되어있는 mercurial 저장소를 복제후 업데이트를 수행하니 문제가 발생했다.

대략보니 한글파일이름을 인식 못하는 문제 같다.

열심히 구글링을 해보니 방법이 나와있었다.

문제 원인은 대략 윈도우의 경우 파일이름을 utf-16으로 저장하는데 머큐리얼에서 유니코드용 윈도우 네이티브 함수를 호출해서 파일이름을 가져와야하는데 안그런다는 문제이다.

아래 extension이 이 문제를 해결해준다.
원리는 그냥 단순히 유니코드 함수를 호출해서 파일이름을 변환후 머큐리얼에 넘겨준다고 한다.


베타버전이라서 문제가 있을지도 모른다고 했으나 그닥 큰 문제는 없는것 같다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/05/10 00:23 2011/05/10 00:23
기존에 관리하던 모든 프로젝트를 머큐리얼로 이전했습니다.

이전중에 일부 tag와 branch가 이전이 안되는 경우가 있었는데 이유를 알아보니 이전하려는 url이 중간에 이름이 바뀌거나(delete and add) 또는 copy가 발생했을 경우에 제대로 추적이 안되는 문제가 발생했습니다.

혹시 이전을 고려하시는 분들은 이것을 염두해두시기 바랍니다.

그래도 머큐리얼 장점이 훨씬 더 많기에 일부 tag와 branch손실은 그냥 두고 이전을 했습니다.
손실된 부분은 기존 svn 저장소를 백업하여 추후 손실된 부분이 필요할 경우 빼 볼수 있도록 했습니다.

머큐리얼로 이전하기 전에 많은 사용기를 검색해보고 장단점을 분석해봤는데 기존에 svn을 잘 쓰고 있는 상태라면 굳이 이전을 할 필요는 없지만 새로 시작하는 프로젝트는 머큐리얼을 사용해보시는걸 강력히 추천합니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/04/27 11:33 2011/04/27 11:33
결론 :
너무 좋다.

조금 긴 결론 :
서브버전에서 못하던 것들, 그리고 지원하지 않았던것들, 그리고 있었으면 하는 기능들이
다 들어있다.

매우 긴 결론:
일단 분산처리 기반이다 보니 서브버전과 달리 checkout 개념보다는 clone개념으로 접근한다. 이는 자신이 작업하기 위해 중앙 저장소로부터 받은 것 자체가 하나의 저장소가 되는것이다.

즉, 서브버전은 중앙통제를 위한 저장소라는 것이 존재하고 작업을 하기 위해서는 이를 checkout 해서 로컬에 특정 리비전의 소스를 저장 후 이를 변경하고 변경사항을 저장소에 commit하여 최종 업로드를 마친다.

하지만 머큐리얼은 중앙저장소라는 개념이 존재하지 않는다. 말 그대로 분산처리 기반이므로 특정한 저장소의 복사본(clone)만 존재한다.

그러면 서브버전과 같은 중앙저장소는 만들수 없는가? 꼭 그렇지만은 않다. 머큐리얼에는 중앙저장소는 없지만 내부적인 정책으로 특정한 저장소를 지정하고 그곳에 모든 변경사항을 올리도록 하면 그것이 중앙저장소가 된다.

그렇다면 분산처리가 되고 저장소의 모든 정보를 다 받아와서 좋은 점이 무엇인가?

자신의 작업본이 하나의 저장소로 취급되므로 로컬 저장소에 commit이 가능하다.
그리고 최종 변경사항은 정책적으로 지정된 중앙저장소에 push하여 최종 업로드를 마친다.

즉, 서브버전에서 commit 한번만 하면 중앙서버에 최종 업로드가 되던것이 머큐리얼에서는 commit -> push를 해야지만 최종 업로드가 된다.

그렇다면 서브버전과 머큐리얼이 다를게 뭐가 있나? 단순히 그냥 저장소 복사본을 가지고 있고 로컬 commit이 가능하고 이를 다시 push하여 중앙저장소에 저장한다면 서브버전과 다를게 전혀 없다.

그런데 머큐리얼은 한가지 기능을 더 가지고 있다.

그것은 로컬에 commit한 사항을 rollback 할 수가 있다는 것이다.
이를 이용하여 얼마든지 로컬에서 변경사항을 가하고 commit 후 잘못 되었으면 rollback을 하면 된다. 단, 주의사항은 rollback은 마지막 commit에 대해서만 가능하면 rollback 후에 redo 같은 기능은 지원하지 않는다.

만약에 여러번 commit 후 특정 리비전의 변경 사항을 제거하고 싶으면 back out 기능을 이용하면 된다.

이 기능은 revert to rev -> merge with current -> commit 이 3단계를 한번에 해주는 기능이다
물론 마지막 commit이 있으므로 history에는 backout 한 기록이 남게 된다.

merge에 대해서도 알아보자.

서브버전의 merge는 Merge a range of revisions, Reintegrate a branch, Merge two different trees 이렇게 총 3가지가 있다.

merge a range of revisions는 말 그대로 리비전의 범위를 지정해서 Working copy에 Merge하는 것이다.

Reintegrate a branch는 서브버전 1.5부터 지원하는 merge tracking 기능을 이용하여 특정 Branch의 모든 변경사항을 전부 기록하여 merge하는 기능이다. 머큐리얼의 merge기능과 유사하다

Merge two different trees는 두개의 tree(주소)를 지정하고 두 tree간의 변경사항을 working copy에 merge하는 기능이다.

여기서 문제가 되는것은 서브버전의 경우 리비전기반 merge를 수행하므로 merge후 branch에 변경을 가한 후 다시 merge하기 위해서는 이전 merge를 마쳤던 리비전을 기억하거나 가져와야한다.
그나마 가장 손쉽게 할 수 있는 Reintegrate a branch는 한번 merge를 수행한 branch는 이곳에 변경을 가한 후 다시 Reintegrate a branch는 할수 없다. 즉, 일회용이다.

이러한 이유로 어쨌든 좋거나 싫든 서브버전은 한번 merge를 하면 merge를 한 branch는 폐기하고 만약에 계속해서 변경을 가하고 싶으면 branch를 다시 생성하고 그곳에 해야한다.

어디다 적어놓고 기억하거나 하면 좋겠지만 만약에 틀리거나 잊었을 때는 대략 낭패이다.
또한 중간에 파일이 삭제되거나 리네임 되는 경우에도 추적이 잘 안되므로 merge가 안된다.

반면 머큐리얼은 branch를 할 경우 부모-자식간 관계를 통해 추적하기 때문에 우리가 생각하는 일반적으로 branch 생성하고 여기에 작업 한 다음에 default(trunk)에 통합이 매우 직관적이고 자연스럽게 된다.

그리고 마지막으로 clone을 할 경우 저장소 자체를 복사하기 때문에 백업이 굳이 필요 없다는 점이다.

단점을 하나 꼽자면 서브버전과 같이 특정 디렉토리만 close하여 개발 할수 없다는 점이다.
Git는 지원하지만 머큐리얼은 지원 안한다. 하지만 이 기능이 논의되고(여기참조)있으므로 곧 지원 할것으로 보인다.

만약에 중앙저장소가 어떤 이유로 삭제 되었다면 복구 하기 위해서는 단순히 로컬 저장소를 중앙저장소로 다시 push하면 끝이다. 물론 머큐리얼도 자체 백업 기능을 지원하지만 굳이 쓸일이 별로 없을 것 같다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2011/04/25 16:40 2011/04/25 16:40
DVCS를 써볼려고 예전에 GIT를 기웃거려봤는데 윈도우 지원이 ㅈㄹ 이라서 관뒀던 기억이 있다.

최근에 잉여력이 조금 남아서 다시한번 도전!!

여전히 GIT는 윈도우에서 쓸려면 좀 뭔가 거부감이 들고..
그러던 중 mercurial도 있다는 것을 알고 오전에 세팅을 해봤다.

svn에서 mercurial로 이전은 그렇게 어렵진 않았는데 svn보다 문서가 적어서
문서 검색하는데 오래 걸렸다.

가능한 svn에서 mercurial 이전은 hgsubversion를 이용하는게 깔끔하다.
다른 방법도 많이 있는데 뭔가 다 실패..
hg convert도 있지만 이건 svn의 ignore 속성을 보존해주지 않는다.

그리고 기본적으로 fedora 14에서 trac이 0.11버전이 최신으로 등록되어있다.
svn쓸때 commit hook을 쉽게 썼는데 mercurial에서는 뭔가 좀 힘들다.

trac 0.12버전에서는 기본 지원한다는데 fedora 14에서는 아직 없다는거..

수동 설치 할려고 했는데 실패..

그냥 commit hook 안 쓸래.

속도도 빠른것 같고 무엇보다 부담없는 branch가 가능하다는것이 가장 마음에 든다.

그런데 저장소 크기는 조금 늘어난거 같다. 예전에 백업 스크립트 돌리면 분할압축으로
4개 정도 나왔는데 8개로 급 증가.....

mercurial이나 git같은 DVCS는 중앙저장소라는 개념이 없다.
clone을 수행한 모든 저장소가 다 그냥 저장소이다.

그렇기 때문에 여기에 있는 changeset이 저기에 있는 저장소로 push될수도 있고
저기에 있는 changeset이 여기로 pull될수도 있다.

즉, push를 단지 어디로 하느냐 뿐이다.

나 아니면 너님들 이라고 생각하면 될것 같다.

이를 이용하여 단순히 서버 한대 두고 모든 push는 한곳으로만 하도록 하면
그것이 mercurial 중앙저장소이다.

svn과 같이 생각할려고 하니 개념이 안섰는데 이렇게 생각하니까 간편한것 같다.

일단은 더 써봐야지 제대로 알것같다
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기
2011/04/22 00:28 2011/04/22 00:28





예전에 Anyvod 구현시에 구현한 것인데 sqlite 사용시 자주 쓸 수 있으므로 따로 뺐습니다.

사용방법은 아래와 같습니다.


CppSQLite3Buffer query("update %Q set Name=? where PID=?", ACCOUNT_TABLENAME);
StatementCache::STATEMENT_ITEM *state = this->m_statCache.GetStatement((const char*)query);
StatementReseter reset(&this->m_statCache, state);

state->bind(1, info.name.c_str());
state->bind(2, (long long)info.pid);

success = state->execDML() > 0;
 

sqlite3 래퍼인 CppSQLite3를 이용했으며 CppSQLite3를 제외한 코드는 LGPL에 의거해서 공개합니다.

ps1. 물론 멀티스레드 세이프하게 작성 된 것임
ps2. 성능은 단일 statement를 수행하는 것보다 1%안되게 더 걸리는 정도임
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/12/23 15:34 2010/12/23 15:34
루아 5.2가 나온다고 합니다. 아래는 관련 주소입니다.

http://lua-users.org/lists/lua-l/2010-01/msg00260.html

현재 정식버전은 아니고 캔디데이트 버전(work1) 비슷한 것 같습니다.
최종 기능은 마지막 버전에서 최종 결정 된다고 하는데 어떻게 바뀔까 기대가 되는군요.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2010/01/11 11:39 2010/01/11 11:39