Please feel free to link to this page.
TOP PDF ver.
Powered by SmartDoc

How to encode a movie on linux

初版 2003/01/31 修正 2005/08/02
Shohei NOBUHARA

プレゼンの用意をしていると,連続画像から動画をつくりたいということがある.windowsではadobe premireなどの各種ソフトウェアによって簡単に実現できるが,linuxや各種unix上でとなると残念ながら選択肢が多いとはいえないし,そのようなノウハウを紹介している文章も現時点では少ない.

そこで現時点で使ったことのある,ムービー作成用のツールの使い方をメモしておくことにする.

目次

1 目的

簡単に言うと,

連続画像(連番画像)をムービーにまとめる

となる.

2 環境

mencoderはWindows版/ Linux版ともに存在する.mpeg_encodeはUnix版のみ(のはず).

3 MEncoderを使う

mplayer[2]にはmencoder[3]というエンコーダが含まれている.これを使うと,mpeg1だけでなくmpeg2, mpeg4(divx), wmvといった各種フォーマットでエンコードできる.特に理由がない場合は,Windows XPで追加コーデックを入れることなく再生できるmsmpeg4v2かwmvでエンコードすればいいのではないだろうか.*.jpgからmsmpeg4v2のムービーを作るには

$ mencoder "mf://*.jpg" -mf fps=25 -ovc lavc -lavcopts \
    vcodec=msmpeg4v2 -o test.avi

とする(fpsは適宜変更すること).

またtest.mpgを作るなら

$ mencoder "mf://*.jpg" -mf fps=25 -ovc lavc -lavcopts \
    vcodec=mpeg1video -o test.mpg -of mpeg

とし,mpeg4 (divx)なら

$ mencoder "mf://*.jpg" -mf fps=25 -ovc lavc -lavcopts \
    vcodec=mpeg4 -o test.avi

とする.2-passエンコードをするには

$ rm -f divx2pass.log
$ mencoder "mf://*.jpg" -mf fps=25 -ovc lavc -lavcopts \
    vcodec=mpeg4:vpass=1 -o test.avi
$ mencoder "mf://*.jpg" -mf fps=25 -ovc lavc -lavcopts \
    vcodec=mpeg4:vpass=2 -o test.avi

とする.これらを行うにはlibavcodecが必要であり,

$ mencoder -ovc help

としたときに

Available codecs:

   ...
   
   lavc     - using libavcodec codecs - best quality!

という行がないようなら,再コンパイルが必要であろう.なおjpeg以外にもpngなどにも対応しているが,コンパイル時のconfigureに依存する.

3.1 Powerpointで再生されない場合

バージョンにもよるが,場合によってはPowerpointに張り付けたときに再生されない(画面が黒いまま)になる場合がある.Windows Media Playerオブジェクトを挿入し,それ経由で再生すると解決する場合もあるが,以下のようにmspmeg4v2かwmvでエンコードしておくと確実であろう.

$ mencoder "mf://*.jpg" -mf fps=25 -ovc lavc -lavcopts \
    vcodec=msmpeg4v2 -o test.avi
$ mencoder "mf://*.jpg" -mf fps=25 -ovc lavc -lavcopts \
    vcodec=wmv2 -o test.wmv

ただしwmv2でエンコードした場合,Windows Media Playerで再生しようとすると「拡張子があっていない」(本来はaviファイルなので)という警告が出るが,拡張子をwmvにしておかないとPowerpointではおそらくうまく再生されない.

4 Berkeley MPEG Toolsを使う

Berkeley MPEG Tools[1](debianパッケージ名はucbmpeg)にはmpeg_encodeという名前のMpeg1エンコーダが含まれている.manページにあるように,このソフトはエンコード毎に設定ファイルを用意する必要がある.この設定ファイルには,

  1. 出力ファイル名
  2. 入力ファイル名.これはワイルドカードを組み合わせたファイルの列挙で指定するため,

    必ずしも連番のファイル名で用意する必要はない

    といえる.

  3. 各種mpeg関連パラメータ

などが含まれる.

なおフレームレートや画像間の時間といったものを指定するには,同じファイルを連続して指定すればよい(デフォルトでは30fps,つまり各画像は1/30秒持続する).

例えば./input/frame_0000.ppm〜./input/frame_0100.ppmから./test.mpgを作るとすると,

# Simple parameter file

OUTPUT          ./test.mpg

INPUT_DIR       ./input/
INPUT_CONVERT   *
INPUT
frame_*.ppm     [0000-0100]
END_INPUT

GOP_SIZE        15
SLICES_PER_FRAME        1

BASE_FILE_FORMAT        PPM

PATTERN         IBBPBBPBBPBBPBBPBBPBBP

# quality parameters

IQSCALE         8
PQSCALE         10
BQSCALE         25

# motion vector search parameters

PIXEL           HALF

RANGE           10 4

# LOGARITHMIC, TWOLEVEL, SUBSAMPLE, EXHAUSTIVE
PSEARCH_ALG      LOGARITHMIC

# CROSS2, SIMPLE
BSEARCH_ALG     CROSS2

# DECODED or ORIGINAL
REFERENCE_FRAME ORIGINAL

といった設定ファイルtest.paraを用意し,

$ mpeg_encode test.para

とすればよい.

5 比較

現時点では,mencoderの方が

などの多くの点でBerkeley MPEG Toolsのものを上回っているようだ.できあがる動画の品質に関してはどちらも問題ないように感じる.

6 おまけ

6.1 mpeg_encodeのコンパイル

mpeg_encodeだけをコンパイルするのなら,

$ make -C $SRCDIR/mpeg_encode/jpeg
$ make -C $SRCDIR/mpeg_encode DEBUGFLAG="-DSIG_ONE_PARAM"

でok.

6.2 mplayerのコンパイル

メモ程度に残しておく.

まずは本体.mplayer本体とffmpegをダウンロードし,コンパイルする.

$ wget \
    http://ftp5.mplayerhq.hu/mplayer/cvs/MPlayer-current.tar.bz2
$ wget \
    http://ftp5.mplayerhq.hu/mplayer/cvs/FFMpeg-current.tar.bz2
$ tar jxvf MPlayer-current.tar.bz2
$ tar jxvf FFMpeg-current.tar.bz2
$ rm -rf MPlayer-20050801/libavcodec
$ mv FFMpeg-20050801/libav* MPlayer-20050801
$ mv MPlayer-20050801 mplayer-1.0cvs
$ cd mplayer-1.0cvs
$ ./configure
$ make
$ make install

最後の./configure以下はdebパッケージを作るなりなんなりすればよい.ちなみにdebパッケージにフォントとスキンを含めてしまうには,

$ wget http://ftp5.mplayerhq.hu/MPlayer/Skin/Blue-1.4.tar.bz2
$ wget \
    http://ftp5.mplayerhq.hu/MPlayer/releases/fonts/font-arial-iso-8859-1.tar.bz2 \
$ tar jxvf font-arial-iso-8859-1.tar.bz2
$ mv font-arial-iso-8859-1/font-arial-14-iso-8859-1 \
    mplayer-1.0cvs/font
$ tar jxvf Blue-1.4.tar.bz2
$ mkdir mplayer-1.0cvs/Skin
$ mv Blue mplayer-1.0cvs/Skin/default

とした上で,main/debian/rulesのbinary-archの$(MAKE)直後に

リスト 1 debian/rules
        mkdir -p $(prefix)/usr/share/mplayer
        for i in font Skin; do cp -r $$i $(prefix)/usr/share/mplayer/; done

を追加すればよい.

6.3 w32codec

基本的にダウンロードして/usr/lib/codecs (もしくは/usr/local)に放り込んでおくだけだが,

リスト 2 Makefile
DESTDIR = /usr

LIBDIR  = $(DESTDIR)/usr/lib/codecs

DIRS    = $(LIBDIR)

all:
        @echo "nothing to be done for build"

clean:
        rm -rf codecs

install:
        mkdir -p codecs
        tar jxvf ../w32codec.tar.bz2
        for i in $(DIRS); do install -d $${i}; done
        (cd w32codec-0.90/ ; \
	for i in *; do install -m 644 $${i} $(LIBDIR)/$${i} ; done)

のようなMakefileを用意すればdeb-makeでパッケージ化できるだろう.なおmplayerをコンパイルする前にインストールしておかないと,mplayerのwin32サポートが無効となる(あるいは--with-codecsdirで明示的に指示する必要がある).また,エンコードにlibavcodecしか使わないのであれば,インストールする必要はない.

参考文献

[1]K.L. Gong and L.A. Rowe. Berkeley MPEG Tools. http://bmrc.berkeley.edu/research/mpeg/index.html
[2]mplayer project. mplayer - movie player for linux. http://www.mplayerhq.hu/
[3]mplayer project. Encoding - MEncoder - The Movie Encoder for Linux. http://www.mplayerhq.hu/DOCS/encoding.html