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

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

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

前回作業用のBGMが欲しくてMPlayerをビルドした話を紹介しました。その際見たように,MPlayerは外部のソフトウェアが無くても主要なCODECには自前で対応しており,単独でMP3ファイルやYouTubeの動画ファイルなどを再生することができました。

その後,MPlayerのビルド時に不足を指摘されたソフトウェアを用意しつつ,MPlayer以外のマルチメディアプレイヤーをあれこれビルドしてみたところ,使っているだけでは気づかないそれぞれのマルチメディアプレイヤーの設計方針の違いに気づかされることになりました。

通常,マルチメディアプレイヤーの評価というと,対応しているCODECの多寡や機能の豊富さが中心になりがちですが,設計方針の違いという視点から眺めるとまた別の特徴が見えてくることでしょう。

Plamo Linux上のマルチメディアプレイヤー

最近では多数のマルチメディアプレイヤーがオープンソースソフトウェア(OSS)として公開されていますが,Plamo Linuxでパッケージとして含めているマルチメディアプレイヤーはMPlayerxineVLCtotemといったところです。ChangeLogファイルを調べてみると,MPlayerが2004年,xineが2005年,totemが2006年,VLCが2007年にそれぞれパッケージを登録していました。

より最近ではMPlayerにQtベースのユーザインターフェースをかぶせて使いやすくしたSMPlayerや,xineにGTK+のユーザインターフェースをかぶせたgxineなどもパッケージ化しています。

以下に各メディアプレイヤーの特徴を簡単に紹介しましょう。

MPlayer

MPlayerは元々ハンガリーで開発が始まったメディアプレイヤーです。前回も紹介したように,MPlayerはLinuxのみならず,WindowsやMacOSでも動作するマルチプラットフォームなソフトウェアを目指して,CUIとして起動する本体部分とそれを操作するためのGUI部分が分離され,開発の中心はCUIとして起動する本体部分になっています。

前回,ほとんど外部ソフトウェアが無い状態でもMPlayerはビルドでき,MP3形式の音声ファイルやMPEG4形式の動画ファイルが再生できることを紹介しました。このような特徴を実現するために,MPlayerではOSSとして公開されている必要な機能のソースコードを積極的に自身の中に取り込む設計になっています。

以下はMPlayerのソースコードを展開した直下のディレクトリです。

 $ ls
 AUTHORS             cfg-mencoder.h     drivers/          libmenu/      mencoder.h  osdep/            snapshot_version
 Changelog           cfg-mplayer-def.h  edl.c             libmpcodecs/  metadata.h  parser-cfg.c      stream/
 Copyright           cfg-mplayer.h      edl.h             libmpdemux/   mixer.c     parser-cfg.h      sub/
 DOCS/               codec-cfg.c        etc/              libmpeg2/     mixer.h     parser-mecmd.c    subopt-helper.c
 LICENSE             codec-cfg.h        ffmpeg/           libvo/        mp3lib/     parser-mecmd.h    subopt-helper.h
 ...
 av_opts.c           configure*         libao2/           m_property.h  mpbswap.h   playtreeparser.c  xvid_vbr.h
 av_opts.h           cpudetect.c        libass/           m_struct.c    mpcommon.c  playtreeparser.h
 bstr.c              cpudetect.h        libdvdcss/        m_struct.h    mpcommon.h  pnm_loader.c
 bstr.h              cpuinfo.c          libdvdnav/        mangle.h      mplayer.c   pnm_loader.h
 cfg-common.h        debian/            libdvdread4/      mencoder.c    mplayer.h   rpm/

ここにあるファイルのうち,たとえばlibdvdcssディレクトリには後述するVLCの開発元であるVideoLanプロジェクトが開発しているlibdvdcssパッケージのソースコードが含まれており,その旨はファイルの先頭部分のコメントにも明示されています。

 $ head libdvdcss/libdvdcss.c

 /* libdvdcss.c: DVD reading library.
  *
  * Authors: Stephane Borel <stef@via.ecp.fr>
  *          Sam Hocevar <sam@zoy.org>
  *          Hakan Hjort <d95hjort@dtek.chalmers.se>
  *
  * Copyright (C) 1998-2008 VideoLAN
  * $Id: libdvdcss.c 31883 2010-08-01 13:52:17Z reimar $
  *
  * This library is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.

また,ffmpegディレクトリにはffmpegプロジェクトが開発しているコードが,READMEやCREDITS,ライセンス文書なども含めて,ほぼそのまま収められています。

 $ ls ffmpeg/
 COPYING.GPLv2     Changelog    Makefile                common.mak  ffplay.c    libavcodec/   libavutil/    tools/
 COPYING.GPLv3     Doxyfile     README                  config.mak  ffpresets/  libavcore/    libpostproc/  version.sh*
 COPYING.LGPLv2.1  INSTALL      cmdutils.c              configure*  ffprobe.c   libavdevice/  libswscale/
 COPYING.LGPLv3    LICENSE      cmdutils.h              doc/        ffserver.c  libavfilter/  subdir.mak
 CREDITS           MAINTAINERS  cmdutils_common_opts.h  ffmpeg.c    ffserver.h  libavformat/  tests/

もちろん,改造や再配布が自由なOSSでは他のプロジェクトのソースコードを再利用することは問題にはなりませんが,後述するようにMPlayerの開発者たちは明確な意図を持ってこのような構成にしているようです。

xine

xineもMPlayer同様,2000年ごろから開発が始まった古参のメディアプレイヤーです。MPlayerが元々ハンガリーを中心に開発が始まったのに対し,xineはドイツで行われたLinuxイベントをきっかけに,当時のLinux上でのDVDの扱いが大変だったことを改良するためのプロジェクトとして始まり,後にはDVDに限らず,さまざまなマルチメディアデータを再生できるメディアプレイヤーに発展していきました。

図1 xineの画面

図1 xineの画面

MPlayerがハンガリーで,xineがドイツで,後述するVLCがフランスで,それぞれ開発が始まったことは, 著作権やリバースエンジニアリングに対する各国の法制度が技術の発展に影響を及ぼした例として興味深く思えます。

xineの特徴は,実際にマルチメディアデータを処理するバックエンド部xine-libとユーザインターフェース部xine-uiが分離され,それぞれが独立したソフトウェアとして開発されていることです。開発の軸足はバックエンド部のxine-libに置かれ,"lib"という名称どおり,さまざまなマルチメディアデータを処理する機能をライブラリとして提供しています。

xine-libのソースコードには,それぞれのCODECを処理する機能がライブラリ化されて収録されています。xine-libでも動画CODECの多くをffmpegを使って処理しますが,MPlayerとは異なり,ffmpegもライブラリ(libffmpeg)化された形で収められています。

 $ ls src/
 Makefile.am  demuxers/  libdts/     libmpeg2/     libspucc/    libspuhdmv/   libxinevdec/  xine-utils/
 Makefile.in  dxr3/      libfaad/    libmpeg2new/  libspucmml/  libsputext/   post/
 audio_out/   input/     libffmpeg/  libmusepack/  libspudec/   libw32dll/    video_out/
 combined/    liba52/    libmad/     libreal/      libspudvb/   libxineadec/  xine-engine/

これらのディレクトリに含まれるソースコードは,MPlayer同様,他のOSSプロジェクトが開発したコードを流用しています。

なお,MPlayerが内蔵しているffmpegのコードはffmpegの最新版に近いようですが,xine-libが内蔵しているffmpegのコードはかなり古いバージョンのままになっていて,xine-libでは外部のffmpegライブラリを使うことを推奨しています。

著者プロフィール

こじまみつひろ

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

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

コメント

コメントの記入