Linux ムービー・動画環境

transcode で DivX 作成

Updated: 2003年5月5日
2003年4月19日

デジタルビデオから取り込んだファイルや TV 録画したファイルを MPEG1 にす るのはMPEG ビデオファイルの作り方で述べたとおりですが、MPEG1 は画質の割に容量が大きいし、もはや時代遅 れの感も否めません。そこで フリーの MPEG4 である DivX に挑戦してみます。 MJPEG Tools にも lav2divx というツールがあり Motion JPEG から DivX に変 換できるようなのですが、ここではより汎用性の高く、2-pass エンコーディン グもできる transcode を使います。

transcode はさまざまな形式のオーディオ・ビデオファイルを変換できる最強のツールで す。ただし、単体で動作するものではなく、さまざまな他のコ−デック等のソフトを利用してそれを可能としています。例えば、Motion JPEG を変換するには MJPEG Tools が必要です。

1. コーデックのインストール
2. transcode のインストール
3. transcode を使った DivX 作成 − DV カメラデータの変換
4. transcode を使った DivX 作成 − Motion JPEG の 変換
5. transcode を使った DivX 作成 − 2-pass エンコ−ディング

1. コーデックのインストール

transcode のビルドはサイトにある tar ball を rpm -ta すればできるのですが、そ の前に必要な他のソフトをチェックしましょう。手っ取り早い方法は、tar ball を展開して、configure を走らせます。

$ tar zxvf transcode-0.6.3.tar.gz
$ cd transcode-0.6.3
$ ./configure

すると最後に以下のように現在利用可能な codec 類が表示されます。(yes と 表示されているもの)

----------------------------------------------------------
Summary for transcode 0.6.3 features:

static AV-frame buffering yes
DVD navigation support with libdvdread yes
link against local lame library (>=3.89) | 3.92 yes | yes
support for network (sockets) streams yes
avifile API support no
libmpeg3 dependent modules no
quicktime dependent modules no
libdv dependent modules yes
liba52 audio plugin (>=0.7.3) | default decoder yes | yes
libfame video encoding plugin yes
nasm dependent modules yes
ImageMagick dependent modules (>=5.4.3) no
libjpeg dependent modules | mmx accel yes | no
libxml2 dependent modules yes
mjpegtools dependent modules yes
experimental v4l support yes
experimental lve support no
X11 dependent filter plugins yes
liblzo dependent modules no
libpostproc dependent filter plugin no
experimental Ogg support | Vorbis support no | no
XVID support with libxvidcore no
----------------------------------------------------------

これを見るとわかるように、DVD, quicktime, DV などさまざまな形式のビデ オがそれぞれの codec 等をインストールすることによって変換可能なことがわ かります。
ここでは、映像ソースとしてデジタルビデオのから取 り込んだ映像と xawtv の streamer で録画した Motion JPEG を DivX に変換します。

transcode で DV を読み込ませるには、libdv が必要です。サイトから libdv-0.99-1.src.rpm を持ってきて、

$ rpm --rebuild libdv-0.99-1.src.rpm

とすると、/home/hoge/rpm/RPM/i386/ に libdv-0.99-1.i386.rpm, libdv-devel-0.99-1.i386.rpm ができる ので、以下のようにしてインストールします。

# rpm -ivh /home/hoge/rpm/RPM/i386/libdv-0.99-1.i386.rpm
# rpm -ivh /home/hoge/rpm/RPM/i386/libdv-devel-0.99-1.i386.rpm

Motion JPEG を読み込ませるには、MJPEG Tools が必要です。インストー ル方法に付いては、MPEG ビデオファイルの作り方を見て下さい。 MJPEG Tools でも libdv を使うので先に libdv をインストールした方がいいで しょう。

DivX に変換するには divx4linuxlame (音声部分を MP3 でエンコードするため)が必要です。 (なぜか divx4linux は上の configure の結果にはありませんが 必要です)
divx4linux は divx.com にソースがありますが、Rpmfind.Net から持ってくるのが手っ取り早 いです。divx4linux の検索結果から divx4linux-20020418-1.asp.i586.rpm を持ってきてインストール します。(これ以降 RPM のインストール方法は割愛します。上に倣って下さい)

lame も Rpmfind.Net で探すのがいいでしょ う。ただし、最新の 3.93 のバイナリはことごとく glibc-2.3 が必要 だし、ソースからビルドするにしても、gcc3 が必要だったりしてうまく行きま せん。しかたないので、ひとつ前の 3.92 をとってきます。lame の検索結果の lame-3.92-3.asp.i386.rpm と、lame-devel の検索結果の lame-devel-3.92-3.asp.i386.rpm がすんなりインストールできまし た。

その他のコーデック類も必要に応じてインストールしましょう。

2. transcode のインストール

必要なコーデックなどがインストールされたら transcode のインストールに入 ります。
これはサイトから transcode-0.6.3.tar.gz を持ってきて、

$ rpm -ta transcode-0.6.3.tar.gz

とするだけで RPM が作成できます。 (/home/hoge/rpm/RPM/i386/transcode-0.6.3-1.i386.rpm)これをインストールす れば完了です。
それでは、いよいよ使ってみましょう。

3. transcode を使った DivX 作成 − DV カメラデータの変換

まず、映像ソースの準備です。デジタルカメラ (DV) から取り込んだファイルを 変換してみましょう。DV の PC ヘの取り込みの詳細についてはLinux で DVを見て下さい。 DV カメラ取り込みに必要なドライバ・必要なソフトを全てインストールしたらカメラをつなぎ、

$ dvgrab test --format dv2

とします。
transcode (というか libdv?) では dv2 形式でないとうまく行かな いよなので --format dv2 オプションを付けます。
そしてカメラの再生ボタンを押して再生します。終了させたいところで Ctrl-c で dvgrab を終了させます。--frames オプションでフレーム数を指定すること もできます。
すると同じディレクトリに、test001.avi, test002.avi, test003.avi.... と約 1GB に区切られたファイルができます (それぞれ約4分)。4分以内の場合はファイルはひとつだけです。

ファイルがひとつだけの場合は、以下のようにします。

$ transcode -a 0 -x dv -i test001.avi -g 720x480 -w 500,250,100 -b 128,0,0 -V -f 29.97 -y divx5 -o test -Z 640x480

-a 0 はオーディオチャネルの指定です。0です。
-x dv は映像ソースに DV 形 式を選択したことを指します。
-i は DV ファイルを指定します。
-w は映像の ビットレート、キーフレームの単位、荒さ?を指定します。ビットレート以外は 上記のデフォルト値でいいと思います。
-V を指定するとエンコードが速くなる そうです。指定しておきましょう。
-f 29.97 はフレームレートです。
-y divx5 で出力を DivX version 5 にセットします。
-o test は出力ファイル名です。
-Z 640x480 は出力映像の画面サイズです。

その他にも画像をクリップしたり、イン タレースを解除したりと様々なオプションがあります。man transcode で見ると良い でしょう。

ファイルが複数に渡る場合、ディレクトリを作成しそこに test001.avi, test002.avi ... の元ファイルを全て移動します。余計なファイルは移動しな いようにしましょう。形式の違うファイルが混じっていると transcode 実行時 にエラーします。 ここでは test というディレクトリを作成したことにします。そして、

$ mv test*.avi test/
$ transcode -a 0 -x dv -i test/ -g 720x480 -w 500,250,100 -b 128,0,0 -V -f 29.97 -y divx5 -o test -Z 640x480

のように -i オプションでディレクトリを指定してあげると番号順にファイルを 読み込んでエンコードしてくれます。

4. transcode を使った DivX 作成 − Motion JPEG の 変換

transcode を使って Motion JPEG を変換する際に用意する元映像ファイルでは注意す べき点が一点。それはフレームレートを25, 29.97, または 30 にする必要があ ると言うことです。全て試したわけではありませんが、その他のレートのファイ ルを transcode でエンコードしようとすると エラーで終了してしまいます。これには原因があるのですが、 ここでは streamer で録画する時点でフレームレートを 25, 29.97, または 30 にしておきましょう。

$ streamer -r 25 -o test.avi -f mjpeg -t 12000 -n ntsc -F stereo -R 11025 -i Composite1 -j 50

オプション等の詳細については、ビデオ録画を参 照願います。
次にできたファイルを transcode で divx にエンコードします。

$ transcode -i test.avi -a 0 -w 700,250,50 -b 128 -f 25 -x lav -o test_divx.avi -y divx5 -V

-x オプションでは lav を選択します。しかし、できたファイル test_divx.avi を再生すると色がなんか変です。そこで -k オプションを付けて青と赤を入れ換 えてみます。

$ transcode -i test.avi -a 0 -w 700,250,50 -b 128 -f 25 -x lav -o test_divx.avi -y divx5 -V -k

今度はばっちりです。

上記のフレームレートの件ですが、エラーメッセージは以下の通 りです。

[import_lav.so] lav2yuv "test.avi" | tcextract -x yv12 -t yuv4mpeg
**ERROR: [lav2yuv] File test.avi has 23.976216 frames/sec, choose norm with +[np] param

見るとわかるように transcode では MJPEG tools の lav2yuv と言うコマンドを 内部的に呼び出していて、そこでエラーしているようです。試しに上記の lav2yuv のコマンドを打っても同じエラーが出ます。メッセージの通り、 lav2yuv に +n オプションを付けるとエラーしません (映像のバイナリが標準出 力に出力されます) 。しかし、transcode から lav2yuv に +n を渡す方法はなさそうです。そこで、transcode のソースファイルの import フォルダの import_lav.c の lav2yuv コマンドの部分に +n を付けて保 存しコンパイルします。すると強制 NTSC ですがどんなフレームレートでも変換できます。 (対処療法ですが)

ところで、Linux と Windows をデュアルブートにしている方も多いと思います が、両環境でのデータのやり取りのために VFAT パーティションを Linux 側でマウン トしているかもしれません。これが transcode でエンコードする際に落し穴に なります。元の映像ファイルと出力ファイルは VFAT 上にあっても良いのですが、 カレントディレクトリが VFAT だと Segmentation Fault が発生しエンコー ドできません。したがって、VFAT 上に元ファイルがあり出力先もそこにしたい 場合でも、以下のようにカレントディレクトリを ext2/ext3 などのファイルシ ステム上に移動してから -i オプションと -o オプションをパス付きで記述する ことによって Segmentation Fault を防ぐことができます。

$ cd /tmp/ (tmp ディレクトリは ext2 または ext3 パーティション上にあると する)
$ transcode -i /mnt/VFAT/test.avi -a 0 -w 700,250,50 -b 128 -f 25 -x lav -o /mnt/VFAT/test_divx.avi -y divx5 -V -k

これは divx codec のバグだそうですが、DV ファイルをエンコードする際には 発生しません。(2-pass エンコード時は起きますが)

5. transcode を使った DivX 作成 − 2-pass エンコ−ディング

次は 2-pass エンコードです。
2-pass エンコードとは最初に映像全てをチェッ クしてそれぞれのシーンでの適切なビットレートを算出してからエンコードする ものです。同じビットレートを指定しても、ブロックノイズが少なく高画質でエ ンコードできます。ただし、最終ファイルサイズが計算値とは一致せず、大きく なったり小さくなったりします。また、可変ビットレートなのでネットで のストリーム配信には向きません。さらに時間が倍かかります。

2-pass エンコーディングには -R オプションを使います。
1-pass 目は以下のようにします。

$ transcode -a 0 -x dv -i test001.avi -g 720x480 -w 500,250,100 -b 128,0,0 -V -f 29.97 -y divx5,null -o /dev/null -Z 640x480 -R 1,divx4.log

まだエンコードしませんので、-y オプションの後半の音声形式の指定を null にします。また -o (出力ファイル名) も /dev/null にしておきます。 -R 1,divx4.log の 1 は 1-pass 目であることを指し、divx4.log はビットレー ト情報の格納ファイルを指定します。
次は 2-pass 目です。

$ transcode -a 0 -x dv -i test001.avi -g 720x480 -w 500,250,100 -b 128,0,0 -V -f 29.97 -y divx5 -o test -Z 640x480 -R 2,divx4.log

-R 2,divx4.log は 2-pass 目であることを指し、divx4.log からビットレート 情報を読み込みます。

後はできたファイルを XINE や MPLAYER 等でお楽しみ下さい。

Motion JPEG ファイルを変換する際にも同じ方法で 2-pass エンコーディングできます。


関連リンク:


戻る | real-baishi に戻る