2010年5月2日日曜日

Ubuntu奮戦記 その6 wine+AviSynth(2)

しばらく書くのをサボっていたら、どこまで書いたのか忘れてしまった。
えーと、再生環境と編集&フィルタリングは済んだから、あとはエンコードか。

Windows用のエンコーダーはx264もffmpegもmencoderもavs(AviSynth script file)に対応しているが、Linux用のバイナリは対応していない。
たとえばwindowsなら
x264 source.avs -o video.264
とやればx264でエンコード出来るが、Linuxだとこれが通用しないわけだ。
じゃあ、どうすれば良いかといえば方法は主に二つに分かれる

1.wineを使ってWindows用エンコーダーを利用する。
wineを使えばWindows用のx264もffmpegも普通に動く。
たとえばWindows用のx264.exeを$HOME/.wine/drive_c/windows/system32に突っ込んでやれば、あとは
wine x264.exe source.avs -o video.264
で、エンコードできる。
これがffmpegなら、音声もエンコードできる。
wine ffmpeg.exe -i source.avs -vcodec ffv1 -acodec pcm_s16le movie.avi
これで映像はFFV1、音声はPCMのaviになる。
Windows用のx264はx264.nlで手に入る。
ffmpegはramiro氏のAutomated Build、mencoderなら、sherpya氏なりKovensky氏なりのところにいけばいい。
わざわざMinGWを入れてクロスコンパイルする必要もないし、非常に楽である。

2.wineを使ってavsの内容を標準出力し、Linux用エンコーダーにパイプで渡す。
いくらwineを使えばWindows用バイナリが動くといっても、やはりwine上ではいまいちエンコードは遅くなる。
このためよく使われるのがこの手である。
とりあえずwindows用バイナリにはavsの読み込みだけをさせて、他形式へのエンコードはLinux用バイナリを使うわけだ。
この方法なら大して手間も変わらず、より高速にエンコードできる。
この方法で使うWindows用バイナリは、wineで動いて、標準出力出来るものなら別にffmpegでもmplayerでもなんでも良いが、一番よく使われているのはavs2yuvだろう。

avs2yuvはx264teamの総大将、pengvadoことLoren Merritt氏が、まだmplayerの開発を主にやってたころに作ったWindows用アプリケーションである。
出来ることはavsを読み込み、raw yuv、y4m、そしてHuffyuvで圧縮したaviを出力することだけだが、出力は標準出力でも行えるのがポイントである。
avs2yuv.exeを$HOME/.wine/drive_c/windows/system32にいれて
wine avs2yuv.exe source.avs -o -|x264 - --demuxer y4m -o video.264
とすれば、Linux用のx264でエンコードできる。
avs2yuvは映像のみにしか対応していないので、音声に関してはwaviかffmpegを使えばよい。
wine wavi.exe source.avs -|neroAacEnc -q 0.5 -if - -of audio.mp4

やはりLinux使うなら、エンコード用のバイナリはできるだけLinux用のものを使いたい。
そうでなければ、始めからWindows使えばよいのである。
というわけで、次回はLinux用バイナリのビルドのお話。