w32codecsでvp6のエンコードができるので、それを使ってflv4の動画を作ろうって話。
mencoder input.wmv -o output.flv -ovc vfw -xvfwopts codec=vp6vfw.dll -oac mp3lame -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -af lavcresample=44100 -vf flip,scale=512:384
samplae rateは分からないのでてきとう。-flipはvp6とvp6f(flv4向けvp6)は上下反対だから必要。b_frameが使えないらしいけど大丈夫か不明。
mp3lameのLAMEタグがどうなってるか不明。
vbrの仕方
mplayer/TOOLSのvfw2mencを作り
./vfw2menc -f VP62 -d vp6vfw.dll -s vbr.mcf
をしてVBRに設定し、vbr.mcfをエンコードするパスに移動。
- xvfwoptsをcodec=vp6vfw.dll:compdata=*.mcfにしてエンコード。
2passの仕方
mplayer/TOOLSのvfw2mencを作り
./vfw2menc -f VP62 -d vp6vfw.dll -s first.mcf ./vfw2menc -f VP62 -d vp6vfw.dll -s second.mcf
をして設定しファイルを作成、エンコードするパスに移動。
- xvfwoptsをcodec=vp6vfw.dll:compdata=*.mcfにしてエンコード。
2passのエンコードをする場合、mplayerのバグを回避するために以下のパッチを当ててビルドしてください。
Index: loader/win32.c =================================================================== --- loader/win32.c (リビジョン 22506) +++ loader/win32.c (作業コピー) @@ -66,6 +66,7 @@ #include <dirent.h> #include <sys/time.h> #include <sys/timeb.h> +#include <sys/stat.h> #ifdef HAVE_KSTAT #include <kstat.h> #endif @@ -3581,7 +3582,7 @@ free(tmp); return result; } - if (strstr(cs1, "vp3")) + if (strstr(cs1, "vp3")||strstr(cs1, ".fpf")) { int r; int flg = 0; @@ -3599,10 +3600,10 @@ flg |= O_RDONLY; else if (GENERIC_WRITE & i1) { - flg |= O_WRONLY; + flg |= O_WRONLY | O_CREAT; printf("Warning: openning filename %s %d (flags; 0x%x) for write\n", tmp, r, flg); } - r=open(tmp, flg); + r=open(tmp, flg, S_IRWXU); free(tmp); return r; } @@ -3712,7 +3713,7 @@ static DWORD WINAPI expSetFilePointer(HANDLE h, LONG val, LPLONG ext, DWORD whence) { int wh; - dbgprintf("SetFilePointer(%d, 0x%x, 0x%x = %d, %d)\n", h, val, ext, *ext, whence); + dbgprintf("SetFilePointer(%d, 0x%x, 0x%x = %d, %d)\n", h, val, ext, ext?*ext:0, whence); //why would DLL want temporary file with >2Gb size? switch(whence) {
残念ながらこの方法での2passエンコードはsstファイルが空になりうまくいかないそうです。まぁloaderはwineとしがってその場しのぎだらけだからそういうこともあるだろうかな。
libwineを使おうとおもい色々改変してmplayer+libwine(+*.dll.so)でコンパイルしてみましたが、クラッシュてうまく動かず。