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

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

64ビット用Plamo Linux(Plamo64)の開発作業も佳境に入り、手元では日常の生活環境も64ビット上に移行しました。

ソフトウェアの世界では自分のドッグフードを食べる(Eating your own dog food)という表現があります。これは、自分で作ったソフトウェアを自分で実際に使って、使い勝手や問題点を経験してみる、という意味です。Plamo64も「ドッグフードを食べる」段階に入り、現在は日常作業をPlamo64上で行いながら、作成したパッケージの動作を確認したり、必要な機能を随時追加する作業に追われています。

そうなると欲くなるのは作業中に流すBGMです。最近のLinuxでは、VLCやMPlayer、xine、Totem等のメディアプレイヤーが充実し、CDやDVD、あるいはインターネット上のたいていのマルチメディアコンテンツを再生できるようになっています。

しかしながら、このような便利な環境は一朝一夕にできあがったものではなく、さまざまなオープンソースソフトウェア(OSS)プロジェクトが積み上げてきた成果のおかげです。今回は、そのようなLinuxのマルチメディア環境について紹介してみましょう。

マルチメディアと各種CODEC

人間の聴覚や視覚は、空気や光の振動の高低や強弱といったアナログデータを認識しますが、アナログデータはそのままではコンピュータで処理することができず、符号化という処理を行ってデジタルデータ化してやる必要があります。一方、コンピュータで処理したデジタルデータを人間が視聴する際には再度アナログデータに戻してやる必要があり、この作業を復号化といいます。この「符号化(COding⁠⁠復号化(DECoding⁠⁠」の処理を行うソフトウェアをCODECと呼びます。

アナログデータをいかに符号化、復号化するかはコンピュータ科学にとっての古くからの研究テーマで、画像や音声、動画といった元データの種類、あるいは利用目的や用途、前提とするコンピュータやネットワークの能力などに応じてさまざまに異なる方法が考案され、その方法を実装したソフトウェア(CODEC)が開発されてきました。

これらの方法の中には、特定の企業が開発して自社の製品のみで使っているものもあれば、ボランティアの個人やグループが開発してフリーに公開しているもの、既存の技術を整理して規格化団体が提唱したものなどさまざまですが、広く普及している方法では、たいていOSSなCODECも開発されています。

CDやDVDの専用プレイヤーでは、CODECはハードウェア的に組み込まれてあらかじめ決められた形式のデータしか処理できないのに対し、ソフトウェアのメディアプレイヤーでは必要なCODECを追加することで新しい形式のデータにも随時対応できます。そのため、ソフトウェアのメディアプレイヤーを前提としたインターネット上の動画コンテンツでは新しい形式が積極的に採用され、再生するために必要なCODECも増えていくことになります。

これら増え続けていくCODECにどのように対応していくかがメディアプレイヤー開発者の悩みどころで、それらをどのように収録していくかがディストリビューション作成者の悩みどころになります。その一例を、MPlayerというメディアプレイヤーで紹介してみましょう。

MPlayerメディアプレイヤー

今回取りあげるMPlayerは、www.mplayerhq.huで公開されているメディアプレイヤーです。MPlayerは当時の既存のメディアプレイヤーに不満を持った原作者が2000年ごろから始めたプロジェクトで、10年を越える歴史を持ち、いよいよ正式版の公開が近づいているそうです。

図1 MPlayerのホームページ
図1 MPlayerのホームページ

MPlayerは、LinuxだけではなくWindowsやMacOSなど、さまざまなプラットフォームで動作するように、メディアの選択や各種操作を行うGUI部分はオプション機能として本体から切り離され、本体部分はコマンドラインから起動するCUIなコマンドとして作られています。また、広く利用されているCODECについては、OSSとして開発されているソースコードを内蔵して外部ライブラリへの依存を減らすように考えられているので、Plamo64のような開発途中の環境でも何とかなるでしょう。

MPlayerのソースコードを展開し、設定用の configure スクリプトを動かしてみたところ、無事終了してビルド可能にはなりましたが、気になるメッセージもいくつか表示されています。

demo@P-Plamo64:$ ./configure
Checking for cc version ... 4.5.2
Detected operating system: Linux
Detected host architecture: x86_64
...
Config files successfully generated by ./configure  !

  Install prefix: /usr/local
  Data directory: /usr/local/share/mplayer
  Config direct.: /usr/local/etc/mplayer
...
  Enabled optional drivers:
    Input: dvdnav(internal) ftp pvr tv-v4l2 tv-v4l tv libdvdcss(internal) dvdread(internal) vcd dvbnetworking
    Codecs: ffmpeg(internal) real xanim libmpeg2(internal) mp3lib(internal) treor(internal) gif OpenJPEG
    Audio output: alsa oss v4l2 sdl mpegpes(dvb)
    Video output: v4l2 matrixview opengl sdl gif89a pnm jpeg mpegpes(dvb) fbdev xvidix cvidix dga xv x11 xover yuv4mpeg md5sum tga

 Disabled optional drivers:
   Input: vstream radio tv-dshow librtmp live555 nemesi cddb cdda bluray smb
   Codecs: libvpx libschroedinger libdirac x264 xvid libdv libopencore_amrwb libopencore_amrnb qtx win32 faad2 
           faac musepack libdca liba52 mpg123 libtheora libgsm speex toolame twolame libmad liblzo
   Audio output: sun openal jack pulse nas esd arts ivtv dxr2
   Video output: zr zr2 ivtv dxr3 dxr2 vesa svga caca aa ggi winvidix 3dfx xmga vdpau xvmc directfb dfbmga bl xvr100 tdfx_vid wii s3fb tdfxfb mga
...

この表示のうち、Enable optional driversの部分に表示されているのが利用可能なドライバのリスト、Disabled optional driversの部分に示されているのが現在は利用できないドライバのリストです。

リストのうち、Input:に示されているのがデータの入力元に関する機能、Codecs:に示されているのがメディアの形式に関する機能、Audio output:が音声データの出力先に関する機能、Video output:が動画データの出力先に関する機能になります。ドライバのうち、(internal)と付記されているのはMPlayerが内蔵しているドライバで、DVDメディアに関する機能やffmpeg、mpeg2, mp3といった広く使われているCODECはMPlayer自身で提供していることがわかります。

"Disabled optional drivers"のリストに示された機能は、本来 MPlayerが対応しているものの、何らかの理由で現在は利用できない機能で、これらの機能を利用するには外部のライブラリなどが必要になります。

いくつか使えない機能があるのは気になるものの、利用可能な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を流しながら、必要なパーツを集めていく作業にとりかかることにしましたが、そのあたりについては回を改めることにしましょう。

おすすめ記事

記事・ニュース一覧