モジュール javafx.media

パッケージjavafx.scene.media

音声およびビデオをJava FXアプリケーションに統合するクラスのセットを提供します。 このパッケージの主な用途は、メディア再生です。 メディア・パッケージには、MediaMediaPlayerおよびMediaViewの3つの主要なクラスがあります。

目次

  1. サポートされているメディア・タイプ
  2. サポートされているプロトコル
  3. サポートされているメタデータ・タグ
  4. Java FXでのメディアの再生

サポートされているメディア・タイプ

Java FXでは、異なる多くのメディア・タイプがサポートされます。 メディア・タイプは、コンテナ・フォーマットと1つ以上のエンコーディングの組合せと考えられます。 コンテナ・フォーマットは、単に、エンコードされたデータを含む基本的なストリームである場合があります。

サポートされているエンコーディング・タイプ

エンコーディング・タイプは、サンプリングされたオーディオまたはビデオのデータを格納する方法を指定します。 通常、エンコーディング・タイプは特定の圧縮アルゴリズムを暗黙的に示します。 次の表は、Java FXメディアでサポートされているエンコーディング・タイプを示します。

メディア・エンコーディング表
エンコーディングType説明
AACAudioAdvanced Audio Codingオーディオ圧縮
MP3Audio Raw MPEG-1、2および2.5オーディオ、レイヤーI、IIおよびIII、サポートされているすべてのサンプリング周波数とビット・レートの組合せ。 注意: ファイルには少なくとも3個のMP3フレームが含まれている必要があります。
PCMAudio非圧縮、生のオーディオ・サンプル
H.264/AVCビデオH.264/MPEG-4 Part 10 / AVC (Advanced Video Coding)ビデオ圧縮
VP6 (*)ビデオOn2 VP6ビデオ圧縮


(*) VP6ビデオ・エンコーディングは、JDK 9以降では非推奨です。

サポートされているコンテナ・タイプ

コンテナ・タイプは、エンコードしたオーディオ、ビデオおよびその他のメディア・データの格納に使用するファイル形式を指定します。 各コンテナ・タイプは、1つ以上のMIMEタイプ、ファイル拡張子およびファイル・シグネチャ(ファイルの初期バイト)と関連付けられています。 次の表は、Java FXメディアでサポートされているコンテナとエンコーディング・タイプの組合せを示します。

メディア・コンテナ / エンコーディング型表
コンテナ説明ビデオ・エンコーディング オーディオ・エンコーディングMIMEタイプファイル拡張子
AIFFAudio Interchange File FormatN/A PCMaudio/x-aiff.aif, .aiff
FXM、FLV (*)FX Media, Flash VideoVP6 MP3video/x-javafx, video/x-flv.fxm, .flv
HLS (**)MP2T HTTP Live Streaming (オーディオビジュアル)H.264/AVC AACapplication/vnd.apple.mpegurl, audio/mpegurl.m3u8
HLS (**)MP3 HTTP Live Streaming (オーディオのみ)N/A MP3application/vnd.apple.mpegurl, audio/mpegurl.m3u8
MP3MPEG-1、2、2.5生オーディオ・ストリーム(ID3メタデータv2.3またはv2.4を持つ可能性がある) N/AMP3audio/mpeg.mp3
MP4MPEG-4 Part 14H.264/AVC AACvideo/mp4, audio/x-m4a, video/x-m4v.mp4, .m4a, .m4v
WAVWaveform Audio FormatN/A PCMaudio/x-wav.wav

(*) JDK 9以降、FXMおよびFLVコンテナは非推奨です。
(**) HLSはコンテナ・タイプではなくプロトコルですが、ここでは同様の属性を集約するために含まれています。

サポートされているプロトコル

サポートされているプロトコル表
プロトコル説明参照先
FILE ローカル・ファイルのURI表現用プロトコル java.net.URI
HTTP リモート・ファイルの表現用ハイパーテキスト転送プロトコル java.net.URI
HTTPS リモート・ファイルの表現に安全なハイパーテキスト転送プロトコル java.net.URI
JAR FILE、HTTPまたはHTTPSプロトコルを介してアクセス可能なファイル内のメディア・エントリの表現 java.net.JarURLConnection
HTTPライブ・ストリーミング(HLS) HTTPまたはHTTPS経由のプレイ・リスト・ベースのメディア・ストリーミング 『Internet-Draft: HTTP Live Streaming』

HTTPを介したMPEG-4再生

ストリームのデコードに必要なヘッダーがファイルの先頭に表示されるように、HTTPまたはHTTPSで再生するMPEG-4メディアをフォーマットすることをお勧めします。 そうでない場合、再生はファイル全体がダウンロードするまで停止することがあります。

HTTPライブ・ストリーミング(HLS)

HLS再生では、次の特性を持つソースを処理します。

  • オンデマンドおよびライブ・プレイリスト。
  • 基本的なMP3オーディオ・ストリーム(audio/mpegurl)、および1つのAACオーディオと1つのH.264/AVCビデオ・トラックの多重MP2Tストリーム(application/vnd.apple.mpegurl)。
  • 整数または浮動小数点期間のプレイリスト。

この基本プロファイルに一致しないソースは、処理が保証されません。 プレイリストには、ソースを構成するストリームに関する情報が含まれ、再生の開始時にダウンロードされます。 別のストリーム、ビット・レートおよびビデオ解像度との切替えは、ネットワーク条件の関数として自動的に処理されます。

サポートされているメタデータ・タグ

メディア・コンテナには、ファイル内のメディアを示す特定のメタデータを含めることができます。 Java FXメディアAPIでは、Media.getMetadata()メソッドを介してメタデータを使用可能にしています。 このマッピングのキーは、次の表に示されたJava FXメディアでサポートされているタグを使用したタグと呼ばれます。 どのタグが特定のメディア・ソースに使用可能かは、実際にそのソースに格納されているメタデータによって異なります。つまり、すべてのタグが使用可能であることが保証されているわけではありません。
"メタデータ・キーとタグ表
コンテナ タグ(文字列型) Type 説明
FXM, FLV audio codec java.lang.String オーディオ・トラックに使用されたエンコーダ。
FXM, FLV duration javafx.util.Duration メディアの期間。
FXM, FLV video codec java.lang.String ビデオ・トラックに使用されたエンコーダ。
FXM, FLV width java.lang.Integer ビデオ・トラックの幅(ピクセル)。
FXM, FLV height java.lang.Integer ビデオ・トラックの高さ(ピクセル)。
FXM, FLV framerate java.lang.Double ビデオ・フレーム・レート(1秒当たりのフレーム数)。
FXM, FLV creationdate java.lang.String ビデオが作成された日付。
FXM, FLV, MP3 raw metadata Map<String,ByteBuffer> 適切なメディア仕様に従った生のメタデータ。 キー「ID3」はMP3 ID3v2メタデータにマップされ、「FLV」はFLV onMetadataマーカー・コンテンツにマップされます。
MP3 album artist java.lang.String アルバム全体のアーチストで、コンピレーションの場合は「Various Artists」となることがあります。
MP3 album java.lang.String アルバムの名前。
MP3 artist java.lang.String トラックのアーチスト。
MP3 comment-N java.lang.String コメント、Nは0相対インデックス。 コメント・フォーマット: ContentDescription[lng]=Comment
MP3 composer java.lang.String トラックのコンポーザ。
MP3 year java.lang.Integer トラックが録音された年。
MP3 disc count java.lang.Integer アルバムのディスク数。
MP3 disc number java.lang.Integer このトラックが存在するディスクの1相対インデックス。
MP3 duration javafx.util.Duration トラックの期間。
MP3 genre java.lang.String トラックのジャンル、Classical、DarkwaveまたはJazzなど。
MP3 image javafx.scene.image.Image アルバム・カバー。
MP3 title java.lang.String トラックの名前。
MP3 track count java.lang.Integer アルバムのトラック数。
MP3 track number java.lang.Integer ディスク上のトラックの1相対インデックス。

Java FXでのメディアの再生

基本的な再生

Java FXでメディアを再生するために必要な基本手順を次に示します。

  1. 必要なメディア・ソースのMediaオブジェクトを作成します。
  2. MediaオブジェクトからMediaPlayerオブジェクトを作成します。
  3. MediaViewオブジェクトを作成します。
  4. MediaPlayerMediaViewに追加します。
  5. Add the MediaViewをシーングラフに追加します。
  6. MediaPlayer.play()を起動します。
前述の手順は、MediaViewクラスのドキュメント内のサンプル・コードで示されています。 次に、注意事項を示します。
  • 1つのMediaオブジェクトは、複数のMediaPlayerの間で共有できます。
  • 1つのMediaPlayerは、複数のMediaViewの間で共有できます。
  • メディアは、表示にビューが必要ですが、MediaViewを作成せずにMediaPlayerにより直接再生できます。
  • MediaPlayer.play()のかわりに、MediaPlayer.setAutoPlay(true)を使用して、再生が可能なかぎり早く開始されるようにリクエストできます。
  • MediaPlayerには、MediaPlayer.Statusで定義されたいくつかの動作状態があります。
  • オーディオのみのメディアは、かわりにAudioClipを使用して再生できます(短いクリップの低レイテンシ再生に推奨)。

エラー処理

Java FXメディア使用時のエラーは、同期的な場合と非同期的な場合のいずれかです。 一般的に、同期エラーはそれ自体をJava Exceptionとして示し、非同期エラーの場合はJava FXプロパティが設定されます。 後者の場合、errorプロパティが直接監視されるか、onErrorコールバックが登録されるか、その両方の場合もあります。

同期エラーの主なソースは、Media()およびMediaPlayer()です。 非同期エラー・プロパティは、Media.errorおよびMediaPlayer.errorで、非同期エラー・コールバックはMedia.onErrorMediaPlayer.onErrorおよびMediaView.onErrorです。

一部のエラーは重複する場合があります。 たとえば、MediaPlayerは、発生したエラーをその関連するMediaに伝播し、MediaPlayerからその関連するすべてのMediaViewへも伝播されます。 その結果、どのプロパティをモニターするかに応じて、1つのエラーの発生に対して複数の通知を受信する可能性があります。

次のコード・スニペットは、メディアのエラー処理を示しています。


    String source;
    Media media;
    MediaPlayer mediaPlayer;
    MediaView mediaView;
    try {
        media = new Media(source);
        if (media.getError() == null) {
            media.setOnError(new Runnable() {
                public void run() {
                    // Handle asynchronous error in Media object.
                }
            });
            try {
                mediaPlayer = new MediaPlayer(media);
                if (mediaPlayer.getError() == null) {
                    mediaPlayer.setOnError(new Runnable() {
                        public void run() {
                            // Handle asynchronous error in MediaPlayer object.
                        }
                    });
                    mediaView = new MediaView(mediaPlayer);
                    mediaView.setOnError(new EventHandler<MediaErrorEvent>() {
                        public void handle(MediaErrorEvent t) {
                            // Handle asynchronous error in MediaView.
                        }
                    });
                } else {
                    // Handle synchronous error creating MediaPlayer.
                }
            } catch (Exception mediaPlayerException) {
                // Handle exception in MediaPlayer constructor.
            }
        } else {
            // Handle synchronous error creating Media.
        }
    } catch (Exception mediaException) {
        // Handle exception in Media constructor.
    }