Java Media Framework

**Java Media Framework**（**JMF**）は、音声や動画など時系列で変化するメディアをJavaアプリケーションやアプレットに追加するためのJavaライブラリである。このオプションパッケージには、各種メディアフォーマットをキャプチャし、再生し、ストリーミングし、変換する機能がある。Java Platform, Standard Edition (Java SE) を拡張するもので、クロスプラットフォームのマルチメディアアプリケーションの開発を可能にする。

## バージョンとライセンス
最初の再生のみ可能なバージョンは、サン・マイクロシステムズ、シリコングラフィックス、インテルが開発し、1997年に JMF 1.0 としてリリースされた。1999年にはサンとIBMが開発した JMF 2.0 が登場し、キャプチャ、ストリーミング、入れ替え可能なコーデック、フォーマット変換などの機能が追加された。

JMF 2.0 には当初 MP3 のコーデックが付属していたが、2002年に削除され、2004年に再生のみのMP3プラグインが登場した。

JMF のバイナリは特殊なライセンスで提供されており、ソースは SCSL (Sun Community Source License) で提供されている。

現在のバージョンには4つのJARファイルがあり、以下の4つのJMFベースのアプリケーションを起動するシェルスクリプトが付属している。

* **JMStudio** - 単純なプレイヤーGUI
* **JMFRegistry** - JMF「レジストリ」を管理するためのGUI。
* **JMFCustomizer** - 特定のJMFアプリケーションが必要とするクラスだけを含むJARファイルを作成する（アプリケーションを配布する際のサイズを減らすため）。
* **JMFInit**

JMF にはあらゆるJavaで動作するバージョンと、プラットフォーム固有の「パフォーマンスパック」がある。後者はそのプラットフォームのネイティブコードを含み、プラットフォーム固有のマルチメディアエンジンを利用する場合がある。JMF 2.0 では、Linux、Solaris（SPARC）、Windows 向けのパフォーマンスパックがある。

## 設計コンセプト
JMF ではメディアを `DataSource` （JMFへのメディア読み込みに対応）と `DataSink` （データのエクスポートに対応）に抽象化している。メディアフォーマットの詳細にプログラマがアクセスできるような作りにはなっていない。単にソース（URLで表す）から読み込んで、再生して、処理して、エクスポートするだけである（コーデックによっては、フォーマット変換をサポートしていない）。

アプリケーションは `Manager` クラスのスタティックメソッドを主に使用する。

## コード例
以下のコード例は、AWTのファイル選択ダイアログであり、メディアファイルを選択するとそれをロードして再生する。


```java
import javax.media.*;
import java.io.File;
import java.awt.*;

public class TrivialJMFPlayer extends Frame {

    public static void main (String[] args) {
        try {
            Frame f = new TrivialJMFPlayer();
            f.pack();
            f.setVisible (true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public TrivialJMFPlayer() 
        throws java.io.IOException,
               java.net.MalformedURLException,
               javax.media.MediaException {
        FileDialog fd = new FileDialog
            (this, "TrivialJMFPlayer", FileDialog.LOAD);
        fd.setVisible(true);
        File f = new File (fd.getDirectory(), fd.getFile());
        Player p = Manager.createRealizedPlayer
            (f.toURI().toURL());
        Component c = p.getVisualComponent();
        add (c);
        p.start();
    }
}
```


この例の大部分は AWT GUI の構築を行っており、JMF を使っているのは2行だけである。` Manager.createRealizedPlayer()` はファイルを表すURLから明示的に `DataSource` を作成し、`Player` を作成し、再生に必要なリソース割り当てと初期化を行う。`getVisualComponent()` は `Player` に対して AWT `Component` として使うのに適したGUIを要求する。コントロールコンポーネントが必要なら、`getControlPanelComponent()` で要求し、別途GUIに追加すればよい。ここではメディアのフォーマットを全く気にしていない点に注意されたい。このコードはJMFが認識できる任意のメディアフォーマットを扱える。

## 批判と代替手法
JMF はサポートしているコーデックが少ないと言われている。例えばJavaバージョンでは、MPEG-2、MPEG-4、RealMedia、ほとんどのQuickTimeムービー、Flash 2 以降のFlashコンテンツを再生できないし、MP3の再生にはプラグインが必要である。一方、パフォーマンスパックではプラットフォームのメディアライブラリを利用できるが、Linux と Solaris と Windows でしか提供されていない。さらに Windows 用パフォーマンスパックを使っていると、実力以上に各種フォーマットをサポートしていると思い込むことがあり、他のプラットフォームではそうではないことをアプリケーション開発後に知ることになる。

また、サンはJMFを放置しているように見える。APIが最後に修正されたのは1999年で、公式サイトの最新ニュースの日付は2004年11月である。JMFは拡張可能なように構築されているが、サードパーティによる拡張はほとんどない。さらに、JMFにはメディアの編集機能がほとんどないため、利用範囲も限られる。

### 代替手法
JMF以外にも Java 上のマルチメディア機能をサポートしたライブラリが存在する。以下に主なものを列挙する。

* Java Sound
* QuickTime for Java
* IBM Toolkit for MPEG-4
* Jffmpeg
* jvlc
* gstreamer-java
* FMJ
* Fluendo's port of Theora to Java
* Directshow <> Java Wrapper
* Fobs4JMF
* JLayer MP3 library

## 脚注

## 外部リンク
*Sun Microsystem's page on JMF
*JMF-Interest, the official discussion list
*December 2005 discussion about a possible revival of JMF at Sun
*Installation Instructions for JMF on Mac OS X