玩式草子─ソフトウェアとたわむれる日々

第19回 Linuxとマルチメディア環境[その1]

この記事を読むのに必要な時間:およそ 5 分

いくつか使えない機能があるのは気になるものの,利用可能なCODECとしてffmpegとmp3libが入っていて,手元にあるMP3ファイルや動画ファイルは再生できそうなので,さっそくビルドしてみました。

demo@P-Plamo64:$ make
cc -MD -MP -O4 -march=native -mtune=native -pipe -ffast-math -fomit-frame-pointer\
   -Wundef -Wall -Wno-switch -Wno-parentheses -Wpointer-arith -Wredundant-decls\
   -Wstrict-prototypes -Wmissing-prototypes -Wdisabled-optimization -Wno-pointer-sign\
   -Wdeclaration-after-statement -std=gnu99  -O4 -march=native -mtune=native -pipe\
   -ffast-math -fomit-frame-pointer -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64\
   -D_LARGEFILE64_SOURCE -Ilibdvdread4 -I. -Iffmpeg  -D_REENTRANT   -I/usr/include/freetype2\
   -DFF_API_MAX_STREAMS=0 -c -o command.o command.c
...
cc -o mencoder mencoder.o parser-mecmd.o xvid_vbr.o libmpcodecs/ae.o libmpcodecs/ae_pcm.o\ 
    libmpcodecs/ve.o libmpcodecs/ve_raw.o libmpdemux/muxer.o libmpdemux/muxer_avi.o libmpdemux/muxer_mpeg.o\
    libmpdemux/muxer_rawaudio.o libmpdemux/muxer_rawvideo.o libmpcodecs/ae_lavc.o libmpcodecs/ve_lavc.o\
     ....
    stream/stream_vcd.o libmpcodecs/ad_libvorbis.o libmpdemux/demux_ogg.o libmpcodecs/vd_xanim.o\
    ffmpeg/libavformat/libavformat.a ffmpeg/libavcodec/libavcodec.a ffmpeg/libavcore/libavcore.a\
     ffmpeg/libavutil/libavutil.a ffmpeg/libpostproc/libpostproc.a ffmpeg/libswscale/libswscale.a\
    -Wl,-z,noexecstack -ffast-math -lncurses -lpng -lz -ljpeg -lopenjpeg -lungif -lasound -ldl\
    -lpthread -lfreetype -lz -lfontconfig -lz -lbz2 -lpthread -ldl -rdynamic -lm

上述のように,MPlayerは主要なCODEC用のライブラリを自前で用意しているので,それら全てをコンパイルする作業には多少時間がかかりますが,無事最後まで通ったようです。さっそく手元のMP3ファイルで再生してみると,無事スピーカーから曲が流れました。

demo@P-Plamo64:$ 。/mplayer 01_水月.mp3
MPlayer SVN-r32826-snapshot-4.5.2 (C) 2000-2011 MPlayer Team

Playing 01_水月.mp3.
Audio only file format detected.
Load subtitles in ./
==========================================================================
Opening audio decoder: [mp3lib] MPEG layer-2, layer-3
AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400)
Selected audio codec: [mp3] afm: mp3lib (mp3lib MPEG layer-2, layer-3)
==========================================================================
AO: [oss] 44100Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:   8.6 (08.6) of 408.0 (06:48.0)  0.3%

ターミナルに表示されたメッセージを見ると,読み込んだファイルは128KBのMP3形式で,MPlayerが内蔵しているmp3libを使って再生していることがわかります。

また,YouTubeあたりからダウンロードしてきたMP4ファイルも無事再生できました。

図2 MPlayer内蔵のCODECのみでMP4ファイルを再生

図1 MPlayer内蔵のCODECのみでMP4ファイルを再生

同じくターミナルのメッセージによると,この動画ファイルは動画データがH.264形式,音声データがAAC形式で,それぞれffmpegのlibavcodecを使って再生しています。

MPlayerの対応する外部CODEC

MP3の音声ファイルとMP4,FLVあたりの動画ファイルが再生できれば,とりあえず手元の音楽や動画のライブラリを楽しめるので作業用BGMの心配は無くなりましたが,MPlayerをPlamo64に収録して広く使ってもらうには,先の configure 時に使用不可とされた機能が気になります。そこで,使用不可とされたCODECについてざっと調べてみました。

libvpxGoogleがHTML5用に推進しているWebM形式が利用するVP8 CODEC
libschroedinger & libdirac英国BBCが開発,公開している,高解像度の動画データに適したDiracと言うCODEC
xvidXvid projectが開発しているMPEG-4(Part2)用CODEC。MPEG-4(Part2)はMPlayerに同梱されているffmpegでも対応していますが,処理アルゴリズムが異なるので画質等に多少の違いがでるそうです
x264Blu-ray Discで広く使われているMPEG-4/AVC(H.264)用のCODEC。実行例で見たようにMPlayer内蔵のffmpegでもH.264形式のデコードには対応していますが,エンコードにはx264プロジェクトが開発しているライブラリが必要となるそうです
libdvデジタルビデオで広く使われているDV形式用のCODEC
libopencore_amrwb & libopencore_amrnb第3世代の携帯電話(3GPP)が採用しているAMR(Advanced Multi-Rate)形式の音声用CODEC。amrwbがより広帯域化された仕様で音質が改善しているそうです
qtx & win32MPlayerには,OSSなCODECが存在しない形式に対してWindows用に配布されているCODECを流用する機能があります。これらはその機能を使うためのライブラリですが,MPlayerと共に公開されている非OSSなCODECの多くは32ビット用なので,64ビット用の環境ではあまり意味が無いでしょう
faac & faad2AAC(Advanced Audio Codec)という音声データ用形式を扱うエンコード(faac)とデコード(faad2)用ライブラリ。先の実行例で見たように,AACもMPlayer内蔵のffmpegで対応していますがアルゴリズム等が異なる外部ライブラリも使えるようになっているようです
musepackOSSで開発されている音声データ用のCODECでMP3よりも音質がよいそうです
libdca映画やDVD/Blu-ray,PS3などで使われているDTS(Digital Theater System)形式の音声データ用のCODEC
liba52映画やDVD/Blu-ray,PS3などで使われているDolby Digital(AC-3やATSC A/52とも呼ばれる)形式用のCODEC
mpg123MP3形式の音声データをデコードするためのCODEC。ffmpegよりもはるかに高速にMP3データをデコードできるそうです
libtheoraフリーで公開されているTheoraと言う動画用CODEC
libgsmGSM(Global System for Mobile communication)という第2世代の携帯電話で採用されている音声圧縮形式用のCODEC
speexフリーで公開されている,人の声の圧縮に特化した音声データ用のCODEC
toolame & twolameMP3よりは圧縮率は劣るものの,DVDやCS放送などで広く使われているMPEG-1/2 Audio Layer2形式の音声用CODECを操作するライブラリ。toolameの開発が止まったためtwolameというプロジェクトが引き継ぎましたが,両者ではAPIが変っているため双方を使えるようにしているようです
libmadMpeg Audio Decoderの略で,MPEG-1/2で規定している音声データをデコードするためのライブラリ。ffmpegにも同様の機能はあるものの,libmadでは演算に固定小数点を用いているため処理が高速だそうです
liblzolzoは圧縮率は低いものの高速に処理できることが特徴の圧縮形式で,その特徴を使って非圧縮な動画ファイルを劣化させずに圧縮することができるそうです

ざっと調べた限りでは,MPlayer内蔵のffmpegでまかなえるCODECも多そうですが,これからの標準になりそうなWebM用のVP8 CODECは使えるようにしておかないとマズそうですし,BBCが開発しているというDirac CODECもおもしろそうです。また,MPlayerをDVDプレイヤーとして使うにはlibdcaliba52も必要になるでしょう。

ここで紹介したのはCODEC回りだけですが,configure時に使用不可とされた入力元や出力先についても使われそうなものは対応しておく必要があるでしょう。とりあえず最小規模で作ったMPlayerでBGMを流しながら,必要なパーツを集めていく作業にとりかかることにしましたが,そのあたりについては回を改めることにしましょう。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html