ネットワークを通して大観衆にインタラクティブなマルチメディア体験を配信することは今や夢ではありません。初期の試みは、恐ろしく高価な通信コストと、高圧縮画像をリアルタイムにデコードできるPCがほとんど無かったことことから困難を極めていました。今やブロードバンド・インターネットと高速化を続けるPCプロセッサーのおかげで、障害が無くなってきたのです。
MPEG-4はインタラクティブなマルチメディア・コンテンツをネットワーク経由で保存し、オーサリングし、エンコードし、そして配信するための、一連の国際標準です(囲み記事 MPEG-4について を参照)。ごく最近まで、MPEG-4の核心部分の技術は気軽に近づけるようなものではありませんでした。MPEG-4に関する実験を行っている人達の大部分は、圧縮アルゴリズムの研究者やコンスーマー・エレクトロニクスの設計エンジニア、あるいは独自ソフトウェアの開発者達でした。
IBM Toolkit for MPEG-4とその関連のソフトウェア開発キット(SDK)は、IBM alphaWorksから入手できます。これを使用すると、Java 2プラットフォームをサポートするPCを持つ人であれば誰でも、MPEG-4技術にアクセスできるようになります。このツールキットでは、再利用可能なJavaソフトウェア・コンポーネントと、MPEG-4プレーヤーを作ったりMPEG-4コンテンツを扱ったりするためのツールが実際的なセットとしてまとめられています。ですからこの実稼働品質のツールを、すぐにでも動かすことができるのです。
この記事では、SDKとツールキットによって何ができるかを、弾丸列車に乗って見て行きます。まず、SDKライブラリーを使って、カスタムのJava MPEG-4プレーヤーをコード化します。次にアプレットを使って、オンデマンドでダウンロードできるMPEG-4プレーヤーを作ります。そして最後に、MPEG-4コンテンツ配信の様々な方法と、配信用コンテンツを準備するための役に立つツールについて学びます。
MPEG-4 Toolkit SDKを使うと、カスタム化したMPEG-4ムービー・プレーヤーを簡単に作ることができ、Javaのコーディングを追加する必要はほとんどありません。図1はカスタム化したMPEG-4プレーヤーである「developerWorks Cinema」を示しています。
図1. カスタム化したMPEG-4プレーヤー
このプレーヤーは、コード・ディストリビューション( Download セクションを見てください)の中にあるplayer.batファイルを実行すれば試すことができます。またsurf.mp4というMPEG-4ビデオ・ファイルもあるので、すぐにムービーを再生することもできます。プレーヤーをスタートする前に、IBMMpeg4SDKL1 JARファイルをlibディレクトリーにコピーすることを忘れないでください(ツールキットのダウンロード情報に関しては、囲み記事 IBM Toolkit for MPEG-4のダウンロード を見てください)。
図1で、ムービー・プレーヤーのウィンドウのタイトルと、シネマ・スクリーンの上のカスタム・ロゴに注目してください。こうしたタイトルは、player.propと呼ばれるプロパティー・ファイルを通してプレーヤーに与えることになります。これをリスト1に示します。
リスト1. player.propを使ってMPEG-4プレーヤーをカスタム化する
movie=surf.mp4
ttitle=developerWorks Cinema
htitle=<html><font size=+1 color=white>developer</font><font size=+2
color=white>Works</font><font size=+1 color=yellow> Cinema</font></html>
width=320
height=340
|
リスト1で、
htitle
プロパティーは、Java Swing
JLabelコンポーネントに渡されるHTMLストリングです。JLabelは直接HTMLを描画できるので、図1のように「developerWorks
Cinema」というロゴが描画されることになります。
このプレーヤーはplayer.propファイルにあるプロパティーを変更することによって、プレーヤーのソース・コードを再コンパイルすることなく、完全に設定し直すことができます。表1はそうしたプロパティーを表しています。
表1. player.propのプロパティー
| プロパティー | 説明 |
movie
| 再生すべきMPEG-4ムービーのファイル位置またはURL |
ttitle
| プレーヤー・ウィンドウのタイトル・バーに表示するタイトルの文字列 |
htitle
| シネマ・スクリーンの上に表示される、HTMLベースのタイトル |
width
,
height
| プレーヤー・ウィンドウの幅と高さ |
ソース・コードはリスト2に示すように、
com.ibm.dw.mpeg4.MoviePlayer
と呼ばれるクラスで構成されています。
リスト2. カスタム化可能なMoviePlayerのソース・コード
package com.ibm.dw.mpeg4;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
import player.*;
public class MoviePlayer extends JFrame {
private static final String PROP_FILE_NAME = "player.prop";
private static final String MOVIE_PROP_NAME= "movie";
private static final String TEXTTITLE_PROP_NAME = "ttitle";
private static final String HTMLTITLE_PROP_NAME = "htitle";
private static final String WIDTH_PROP_NAME = "width";
private static final String HEIGHT_PROP_NAME = "height";
private JPanel logoPanel;
private PlayerControl Player;
public MoviePlayer(String txtName, String htmlName, int Width, int Height) {
Player = PlayerFactory.createMPEG4Player();
logoPanel = new JPanel();
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {exit();}
});
getContentPane().setLayout(new BorderLayout());
Player.setAutoSize(false);
logoPanel.setBackground(Color.BLACK);
logoPanel.add( new JLabel( htmlName));
getContentPane().add( BorderLayout.NORTH, logoPanel);
setTitle(txtName);
setSize(Width , Height);
show();
}
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
FileInputStream fis =
new FileInputStream(PROP_FILE_NAME);
prop.load(fis);
String movieName =
prop.getProperty(MOVIE_PROP_NAME);
MoviePlayer app = new MoviePlayer(
prop.getProperty(TEXTTITLE_PROP_NAME),
prop.getProperty(HTMLTITLE_PROP_NAME),
getIntProp(prop, WIDTH_PROP_NAME, 300),
getIntProp(prop, HEIGHT_PROP_NAME, 200)
);
if (movieName != null)
app.playMovie(movieName);
}
private void playMovie(String loc) throws Exception {
getContentPane().add(BorderLayout.CENTER, Player.getRendererComponent());
validate();
Player.open(loc);
Player.start();
}
private void exit() {
Player.stopUrl();
remove(Player.getRendererComponent());
dispose();
System.exit(0);
}
private static int getIntProp(Properties prop, String name, int defaultVal) {
String tmpValue = prop.getProperty( name);
int retval = defaultVal;
if (tmpValue != null) {
try {
retval = Integer.parseInt(tmpValue);
}
catch (Exception ex) {
/* fall through with retval=0 */
}
}
return retval;
}
}
|
リスト2では、
MoviePlayer
はSwingコンポーネントから作られています。
com.ibm.dw.mpeg4.MoviePlayer
はJFrameです。図2は、
MoviePlayer
でのコンポーネントの配置を示しています。
図2. MoviePlayerにおけるSwingコンポーネントの配置
SDKライブラリー・クラス/インターフェースが2つ必要になります。
-
Player.PlayerFactoryはMPEG4プレーヤーのインスタンスを取得します。 -
Player.PlayerControlはプレーヤー・インスタンスにアクセスするために使用するインターフェースです。
図3は、 リスト2 のコードがどのようにカスタムMPEG-4プレーヤーを生成、構成するかを示しています。
図3. カスタムのMPEG-4プレーヤーを作る
図3を見ると、このライブラリーのMPEG-4プレーヤー・インスタンスが
PlayerControl
インターフェースを通してのみアクセスされていることが分かります。プレーヤー・インスタンスを取得するためには、
MoviePlayer
のコンストラクターの最初の行にある、
PlayerFactory
クラスの静的ファクトリー・メソッドを呼ぶ必要があります。
Player = PlayerFactory.createMPEG4Player(); |
PlayerControl
インターフェースには、プレーヤーの振る舞いを制御する多くのメソッドがあります。これは、ムービーを表示するためのGUIコンポーネントを取得するためのインターフェースでもあります。表2は、
PlayerControl
インターフェースの中で最も頻繁に使用されるメソッドを示しています。
表2. PlayerControlインターフェースのメソッド
| メソッド | 説明 |
setAutoSize()
| プレーヤーがコンテナーを強制的にリサイズするかどうかを決定します。上の例では偽(false)に設定されています。 |
getRendererComponent()
|
ムービーを表示するために使用する、
java.awt.Component
ベースのオブジェクトを取得します。
|
open()
| MPEG-4コンテンツをオープンし、いつでも再生できるようにします。 |
start()
| コンテンツの再生を開始します。ムービーはレンダラー・コンポーネント上で表示されます。 |
PlayerControl
インターフェースの他のメソッドに関する、さらに詳しい記述についてはSDKのJavadocを見てください。
シネマ・スクリーンの上でMPEG-4ムービーを表示するには、
PlayerControl
インターフェースの
getRendererComponent()
を呼ぶ必要があります。このコールは
java.awt.Component
を返します。
リスト2
の
playMovie()
メソッド内部にある次のコードは、
java.awt.Component
を
MoviePlayer
JFrameの子コンポーネントにします。
getContentPane().add(BorderLayout.CENTER, Player.getRendererComponent()); |
スタンドアローンのプレーヤーは、ハードディスクから、あるいはネットワーク経由でビデオを再生しますが、そのためにはまず、ユーザーのPC上でプレーヤー・ソフトウェアが使用できるようになっている必要があります。これは、皆さんが自分のショーをマルチメディアDVDやCD-ROMで配布する時には問題になりません。ところがユーザーの大部分がインターネットからそのショーにアクセスする場合には、皆さんはシン・クライアント(thin-client)でオンデマンドでのダウンロード・ソリューションの方を選ぶでしょう。
シン・クライアントのソリューションでは、ユーザーがビデオを見るために必要なのはブラウザーのみです。ブラウザーがそのシネマのWebページに到達すると、次のシーケンスが起こります。
- 小さな、簡略版のビューアー(アプレット)がユーザーのマシンにダウンロードされます。
- ユーザーのマシンのJVMが起動し、ビューアー・アプレットが実行します。
- ビューアーからWebサーバー(または同じマシンのストリーミング・サーバー)に対して接続し、ネットワーク用のビデオにアクセスします。
シン・クライアント・ソリューションを構成するには、IBMAppletForMpeg4xxxx.zipダウンロードにある、2つのJARファイルが必要になります(囲み記事 IBM Toolkit for MPEG-4のダウンロード を見てください)。SDKを使えばカスタムのアプレット・ソリューションを構成できるのですが、この記事ではアプレット・パッケージを利用します。
- IBMAppletForMpeg4.jar には、HTTPプロトコルを使って配信するための、MPEG-4ファイル用の軽量アプレット・プレーヤーがあります。MPEG-4ファイルはIBMインターリーブ・フォーマット(IBM interleaved format)である必要があります(この後にある、 HTTPを使った、Webサーバー・ベースの配信 を参照)。
- IBMISMAAppletForMpeg4.jar には、通常Real Time Streaming Protocol (RTSP) とRealtime Transport Protocol (RTP) (囲み記事 RTSP/RTP を参照) を使ってInternet Streaming Media Alliance (ISMA) 準拠のストリーミング・サーバーからMPEG-4ファイルを配信するための、軽量アプレット・プレーヤーがあります。
これからお見せする例では、IBMAppletForMpeg4.jarファイルにあるHTTPプロトコル・アプレットを使います。このアプレットをWebページ、つまりリスト3に示すdwcinema.htmlファイルの中に埋め込むわけです。
リスト3. M4Appletを使った、シン・クライアント・プレーヤーの実装
<html>
<head>
<title>developerWorks Cinema</title>
<style>
h1 {
color:white;
font-weight:normal;
font-size:20pt;
font-family:arial,helv,helvetica,sans-serif;
}
</style>
</head>
<body bgcolor="black">
<h1>
developer<b>Works</b> <font color="yellow">Cinema</font>
</h1>
<applet code="M4Applet.class" archive="IBMAppletForMpeg4.jar"
width="320" height="300">
<param name="url" value="surf.m4x" />
<param name="panel" value="None" />
</applet>
</body>
</html>
|
リスト3では、このページにJavaアプレットを埋め込むために
<applet>
タグを使っています。次に示すような
<applet>
タグに関する幾つかの属性が、ブラウザーとJavaプラグイン(
参考文献
)に対して、どのようにアプレットを表示するかを指示しています。
-
code: 実行すべきJavaクラス。このクラスはjava.applet.Appletのサブクラスである必要があります。リスト3の例では、M4Appletプレーヤーが実行すべきクラスです。 -
archive: 実行可能アプレット・クラスを探し出すために使用するJARファイル。リスト3ではIBMAppletForMpeg4.jarを使っています。 -
width,height: MPEG-4ムービー・プレーヤー・アプレットの表示を確保するための、ブラウザー表示でのピクセル数で表した幅と高さ。
<applet>
のタグのボディにあるアプレットを設定するために次のようなパラメーターを渡すと、アプレットがこうしたパラメーターを使って初期化を行います。
-
url: 再生すべきムービーを指すURL。リスト3では、インターリーブしたMPEG-4ムービーを指しています。 -
panel: コントロール・パネルの設定。持ち得る値としては、None、Mini、BasicまたはDefaultがあります。コントロール・パネルが見えている時には、ユーザーはコントロール・パネルを使って再生を制御することができます(開始、停止、中断、消音、など)。
アプレット・プレーヤーを試すには、次のステップに従います。
- バイナリーFTPを使って、surf.m4xというMPEG-4ビデオとIBMAppletForMpeg4.jarライブラリーを、Webサーバーに転送します。
- ASCII FTPを使って、Webサーバーの同じディレクトリーにdwcinema.htmlファイルを転送します。
- クライアント・マシンのWebブラウザーを使って、Webサーバーからdwcinema.htmlファイルにアクセスします。
図4は、Internet Explorerからアクセスしたアプレット・プレーヤーです。
図4. Internet Explorerで見るアプレット・オンデマンド・プレーヤー
図5は同じアプレット・プレーヤーを、Netscape 7ブラウザーを使ったクライアントから見たものです。
図5. Netscape 7で見るアプレット・オンデマンド・プレーヤー
MPEG-4ムービーのソースとしては下記のようなものが考えられます。
- CD-ROMやDVD-ROM、ハード・ディスクのようなストレージ・メディア
- Apache( 参考文献 )などのWebサーバーを通したネットワーク接続
- Darwin( 参考文献 )のような、特別なストリーミング・メディア・サーバーを通したネットワーク接続
ストレージ・メディアから再生されるMPEG-4コンテンツには特別な準備は何も要りませんが、ネットワーク経由での再生では、どのような伝送手段を使用するかによって、準備が必要になります。
MPEG-4コンテンツの配信にWebサーバーを使用する場合には、まずコンテンツをインターリーブ・フォーマットに変換する必要があります。このツールキットでは、MPEG-4標準のM4Muxインターリーブに基づいたIBM固有のインターリーブ・フォーマットをサポートしており、これはHTTPを使った配信で非常にうまく動作します。このフォーマットのファイルは先のアプレット例のsurf.m4xビデオで分かる通り、.m4x拡張子を持っています。ツールキットのAVgenツールを使うと、通常のMPEG-4ファイルをインターリーブ・フォーマットに変換することができます。
Webサーバーを使用したMPEG-4コンテンツの配信には次のような利点があります。
- コストが低い
- 特別なストリーミング・サーバーを必要としない
- 安価な共有ホスティング・サービスでも動作する
- HTTPはほとんどのファイアーウォールを通過でき、より多くの人にコンテンツを提供できる
- アプレットの例で分かる通り、設定や操作が容易
もし皆さんがストリーミング・メディア・サーバーを使っているのであれば、恐らくそのサーバーは、RTSP/RTPプロトコルを使ってMPEG-4コンテンツを配信するためのISMA準拠のサーバーでしょう(囲み記事 RTSP/RTP と ISMAと3GPP を参照)。その場合にはまず、MPEG-4ファイルをヒンティング(hinting)で準備する必要があります。ヒンティングはインデックスやその他、サーバーでコンテンツをストリーミングするために必要となる情報を追加します。元々のMPEG-4ビデオとオーディオのコンテンツも、ISMA標準プロファイルの一つに準拠している必要があります(囲み記事 ISMAと3GPP 参照)。ストリーミング・サーバー上で再生するMPEG-4ファイルをヒンティングするためには、ツールキットにあるAVgenツールを使います。
RTSPプロトコルとRTPプロトコルは、IPネットワークでのメディア・ストリーミングのために特に設計されており、次のような利点があります。
- メディア・ストリームを早送りしたり巻き戻したりすることができ、また再生はメディア上の任意の点から開始することができます。
- HTTPベースの配信よりも、帯域を効率的に使うことができます。
- 例えば、ライブ・イベントの配信などのように、オンザフライで圧縮したコンテンツ・ストリームで使うことができます。
ツールキットのAVgenツールを使うと、HTTPでの配信用に .m4xでのインターリーブ・ファイルを生成したりストリーミング配信用にISMA準拠ファイルをヒンティングしたりすることに加えて、モバイル・ネットワークでのMPEG-4ファイルの3GPP配信もヒンティングできるようになります(囲み記事 ISMAと3GPP 参照)。
通常MPEGはビデオやオーディオの圧縮と関連して考えられますが、MPEG-4標準では、さらに多くの要素(ストリーム)を網羅しています。
- 複数のフォントから成る、プレゼンテーション品質のテキストを含めた2Dグラフィックス
- 3Dグラフィックス(現在のツールキットでは限定された実装になっています)
- アニメーション
- ユーザーとのやり取り要素
- 埋め込みのJavaコード(現在のツールキットでは実装していません)
XMT-O高水準シーン作成言語を使うと、シーンに場面転換効果を加えたり、2Dグラフィックス、テキスト、アニメーション、ユーザーとのやり取りなどをMPEG-4ショーに追加したりできるようになります(囲み記事 BIFSとXMT 参照)。またXMTプログラム用の開発環境として、IBM Toolkit for MPEG-4にあるXMTBatchツールを使うこともできます。詳細についてはツールキットのドキュメンテーションを参照してください。
alphaWorksのMPEG-4 Toolkit SDKにあるJavaコンポーネントによって、任意のプロジェクトに対してMPEG-4ビデオが容易に追加できるようになります。そして、カスタム化可能なスタンドアローンのプレーヤーを作ったり、またはマシンへのインストールが不要な、軽量アプレットを作ったりすることができます。MPEG-4コンテンツは .m4xインターリーブ・フォーマットで保存できるので、普通のWebサーバーがHTTPでMPEG-4を配信できるようになります。あるいはISMA準拠のサーバーを使って、高品質でランダム・アクセスが可能なRTSP/RTPストリーミング配信をすることもできます。ネットワークでビデオを配信することが、ついに普通のJava開発者の手の届くところにまで近づいたのです。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| j-mpeg4-source.zip | j-mpeg4-source.zip | HTTP |
-
この記事の一番上または一番下にある
Code
アイコンをクリックして(または
ダウンロード・セクション
を見てください)、必要なソース・コードをダウンロードしてください。
-
IIBM Toolkit for MPEG-4
の評価用ソフトウェア・コンポーネントとツールをダウンロードして、この記事で使用しているコードを試してみてください。
-
Moving Picture Experts Groupの公式Webサイトで
最新のMPEGニュース
を見てください。
-
Internet Streaming Media Alliance (ISMA)
のサイトで、ISMA準拠のサーバーに関するストリーミング・メディアのプロファイルや情報について調べてみてください。
-
3rd Generation Partnership Project
のWebサイトでは、3GPPメディアで要求される情報の最新版を見ることができます。
-
rtsp.org
のWebサイトでは、RTSP/RTPについてさらに詳しく学ぶことができます。また規格準拠のプレーヤーやサーバーの最新リストも見ることもできます。
-
HTTPを使ってMPEG-4コンテンツを配信するために、オープン・ソースのWebサーバーである
Apache HTTP Server
を使うことができます。
-
Darwin Streaming Server
は、RTSP/RTPを使ったMPEG-4コンテンツの配信をサポートする、オープン・ソースのストリーミング・メディア・サーバーです。
-
Java Plug-in
をインストールすれば、現在主流となっている最新ブラウザーにアプレット実行機能を追加することができます。
-
IBM Researchの
IBM MPEG-4 Technologies
Webサイトを見ると、IBMにおける最先端のMPEG-4関連プロジェクトについて知ることができます。
-
developerWorksの記事「
ネイティヴパフォーマンスを使ってのメディアプレイヤーのための外観が変更(skinnable)可能なJave
UIsのデザイン
」(2004年3月)ではJava Native Interface (JNI)
の使い方として、WinAmp形式のスキンに基づく高度なUIを構築するためのC
APIである、SLIKスキン・インターフェースへのアクセスを解説しています。
-
developerWorksの
Java Technologyゾーン
には、Javaプログラミングのあらゆる面に関する記事が豊富に取り揃えられています。
-
Developer Bookstore
には、
Java関連の書籍
をはじめ、広範な話題の技術書が豊富に取り揃えられていますので、ご覧ください。

Sing LiはWrox Pressから出版されている多数の本の著者で、Professional Apache Tomcat 、Early Adopter JXTA 、Professional Jini などを執筆しています。技術雑誌に頻繁に寄稿しており、P2P発展に関する熱心なエバンジェリスト(伝道者)でもあります。コンサルタント兼ライターであるSingの連絡先はwestmakaha@yahoo.comです。