ついにベールを脱いだJavaFX

第10回 サウンドとムービー,そしてProduction Suite

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

最近のGUIでは,サウンドやムービーは欠かせない要素になってきています。特にYouTubeが登場してからは,ムービーが当たり前に扱われるようになっています。しかし,Javaではサウンドやムービーなどのメディアは苦手としてきた領域です。

JavaFXではこの状況を打開すべく,JavaOne 2008にてOn2 Technologyとの提携が発表されました。On2 Technologyといえば,Adobe Flash Videoが採用しているVP6コーデックを開発してる企業です。この提携によりJavaFXでもAdobe Flash VideoのFLVフォーマットを再生できるようになりました。

また,同じくJavaが苦手としている領域として,デザイナーとの分業があります。デザイナーでも扱えるツールでGUIを構築することがなかなかできないというのが,Javaの現状です。これはJavaFXでも同じです。

この問題に対し,JavaFXでは既存のツールを活かすという方法を採用しました。それがJavaFX Production Suiteです。

Production Suiteにはいくつかのツールが含まれていますが,キーとなるのがAdobe IllustratorとAdobe Photoshopのプラグインです。IllustratorとPhotoshopはデザイナーにとってデファクトスタンダードとなりつつあるツールです。Production Suiteのプラグインを使用することで,IllustratorやPhotoshopで作成したアートワークをそのままJavaFXの世界に持ち込むことができるのです。

今回は,この2つの領域,メディアとProduction Suiteについて解説していきます。なお,今回使用したサンプルのソースを含めたNetBeansのプロジェクトは,下記のリンクよりダウンロードすることができます。

JavaFXがサポートしているメディア

サウンドやムービーのAPIを紹介する前に,現在JavaFXでサポートしているメディアについてまとめておきましょう。現状では,JavaFXを動作させるプラットフォームによってサポートしているメディアが異なります。表1にサポートしているメディアをまとめました。

表1 JavaFXがサポートしているメディアJavaFX FAQより引用)

プラットフォーム コーデック ファイルフォーマット
Mac OS X 10.4以降 ビデオ: H.261,H.263,H.264,MPEG-1,MPEG-2,MPEG-4,Sorenson Video 2,Sorenson Video 3
オーディオ: AIFF,MP3,WAV,MPEG-4 AAC Audio,MIDI
.3gp,.3gpp,3g2,3gp2,
.avi,.mov,.mp4,.mp3,
.m4a,.m4b,.m4p
Windows XP,Vista ビデオ: Windows Media Video,H.264
オーディオ: MPEG-1,MP3,Windows Media Audio, MIDI
.mp3,.wav,
.wmv,.avi,.asf
Windows XP,Vista,Mac OS X 10.4以降,Linux,Solaris ビデオ: On2 VP6
オーディオ: MP3
.flv,.fxm,.mp3

WindowsではDirectXに含まれるDirectShowがサポートしているメディアを使用することができ,Mac OS XではQuickTimeがサポートしているメディアを使用することができます。

プラットフォームによらずサポートしているサウンドはMP3です。ムービーはコーディックとしてOn2 VP6を使用したAdobe Flash VideoのFLVフォーマット,またSun Microsystems社が策定したFLVのサブセットであるFXMフォーマットを使用することができます。

FLVフォーマットと,FXMフォーマットの両方フォーマットを作成できるツールは,現状On2 Flixしかありません。On2 Flixは試用版が60日間使用できるので,試しに使ってみるのはいいかもしれません。ただし,試用版は左下にOn2のクレジットが入ってしまいます。

FLVフォーマットだけであれば,Adobe Creative Suite 4に含まれるAdobe Media Encoderで作成することができます。本解説でもAdobe Media Encoderを使用してムービーをエンコードしました※1)。

※1)
Adobe Creative Suite 3に含まれるAdobe Flash Video Encoderでもムービーの作成が可能です。

サウンドを扱う

では,実際にメディアに関するAPIを使用していきましょう。まずはサウンドです。

とはいうものの,サウンドもムービーも同じクラスを使用して再生します。サウンドとムービーの違いは描画の有無でしかありません。

メディアを扱うのがjavafx.scene.media.Mediaクラスです。Mediaクラスは再生するメディアをsourceアトリビュートで表します。sourceアトリビュートはURIでメディアの位置を指定します。サウンドの場合,プロトコルとしてhttp:とfile:が使用できます。また,サウンドファイルをJARファイルに含めることも可能です。

メディアを再生するのがjavafx.scene.media.MediaPlayerクラスです。MediaPlayerオブジェクトのmediaアトリビュートにMediaオブジェクトを指定し,play関数をコールすることでメディアを再生します。再生の停止はstop関数,ポーズはpause関数です。たとえば,クラスファイルと同ディレクトリにあるsound.mp3ファイルを再生するには次のようなスクリプトを使用します。

リスト1

var player = MediaPlayer {
     // 再生するサウンドファイル
    media: Media {
        source: "{__DIR__}sound.mp3"
    }
};
 
// サウンドの再生
player.play();

これだけです。簡単ですね。

MediaPlayerクラスにはmediaアトリビュート以外に,ボリュームを表すvolumeアトリビュートや,繰り返して再生する回数を表すrepeatCountアトリビュートなどがあります。これらのアトリビュートも使ってサンプルを作成してみましょう。

音符の形のノードをクリックしている間サウンドを再生し,マウスボタンを放すとサウンドの再生を停止するというサンプルです。それだけでなく,音符をドラッグすることにより,ボリュームや左右のバランスを変更することも行ってみましょう。垂直方向のドラッグがボリューム,水平方向のドラッグがバランスを変更するようしてみました。

音符の形は楕円と直線を用いて作成しました。音符の位置はlocationX変数とlocationY変数にバインドさせます。locationXがバランスに連動し,locationYがボリュームに連動します。

以下にMediaPlayerオブジェクトを生成する部分を示します。

リスト2

// 音符の形の x 座標
// サウンドの左右のバランスに連動
var locationX = 100.0;
 
// 音符の形の y 座標
// サウンドのボリュームに連動
var locationY = 100.0;
 
var player = MediaPlayer {
    // 左右のバランスは -1.0 から 1.0 の範囲
    balance: bind locationX / 100.0 - 1.0
 
    // ボリュームは 0.0 から 1.0 の範囲
    volume: bind (200.0 - locationY) / 200.0
 
    // 無限に繰り返す
    repeatCount: MediaPlayer.REPEAT_FOREVER
 
    // 再生するサウンドファイル
    media: Media {
        source: "{__DIR__}sound.mp3"
    }
}

locationXとlocationYは0から200までの値をとるようにしています。左右のバランスを表すbalanceアトリビュートは-1.0から1.0の値を取るので,locationXと連動できるように100で割り,1を引いています。同様にvolumeは0.0から1.0の値を取り,上にいくほどボリュームを大きくさせるため,200からlocationYを引き,200で割っています。

また,クリックしている間ずっとサウンドを再生させるため,repeatCountアトリビュートを無限に繰り返すMediaPlayer.REPEAT_FOREVERに設定しています。

著者プロフィール

櫻庭祐一(さくらばゆういち)

横河電機に勤務するかたわらJava in the Boxにて新しい技術を追い続けています。JavaOneは今年で11年目。名実共にJavaOneフリークと化しています。

コメント

  • 表1 JavaFXがサポートしているメディア(JavaFX FAQより引用)について

    こんにちは。表1にあるhttp://javafx.com/faq/を見たのですが、表1にあるような情報が見つけられませんでした。もう少し具体的な場所をお教え頂けないでしょうか?(それとも移動してしまったのでしょうか)。mp4(h264)を使いたいのですが、うまく行かず詳しい情報を探しています。

    Commented : #1  たかはし (2009/05/14, 00:26)

コメントの記入