Java >> Java チュートリアル >  >> Java

JavaFX メディア API

これは、JavaFX Media API に関する記事です。 JavaFX は、JavaFX Media API を介したオーディオとビデオの再生をサポートしています。静的メディア ファイルとライブ フィードの HTTP ライブ ストリーミングもサポートされています。

AAC、AIFF、WAV、MP3 など、多数のメディア形式がサポートされています。 VP6 ビデオと MP3 オーディオを含む FLV、および H.264/AVC ビデオ形式の MPEG-4 マルチメディア コンテナもサポートされています。

特定のメディア形式のサポートは、プラットフォームに依存します。一部のメディア再生機能とフォーマットは、追加のインストールを必要としません。サードパーティ ソフトウェアのインストールが必要なものもあります。




次の表に、記事全体の概要を示します。

目次

1.はじめに
2.オーディオ クリップの再生
2.1 コード
2.2 GUI
3.メディアの再生
3.1 コード
3.2 メディア オブジェクトの作成
3.3 MediaPlayer オブジェクトの作成
3.4 MediaView ノードの作成
3.5 MediaView のカスタマイズ
3.6 Media、MediaPlayer、MediaView の組み合わせ
3.7 GUI
4.再生エラーの処理
4.1 コード
4.2 GUI
5. MediaPlayer の状態遷移
5.1 コード
5.2 GUI
6.メディア プロパティの制御
6.1 コード
6.2 メディア再生の繰り返し
6.3 再生速度の制御
6.4 再生音量の制御
6.5 GUI
7.メディア時間の追跡
7.1 コード
7.2 GUI
8.メディアでの位置のマーキング
8.1 コード
8.2 GUI
9.メディアでの位置のマーキング
9.1 コード
9.2 GUI
10. Java ソースコードをダウンロード

次の例では、Java SE 7 と JavaFX 2.2 を使用しています。

1.はじめに

Media API は次のクラスで構成されています:

  • オーディオクリップ
  • メディア
  • メディアプレーヤー
  • MediaView
  • MediaErrorEvent
  • MediaException

AudioClip は、最小限のレイテンシーで短いオーディオ クリップを再生するために使用されます。通常、これは効果音 (通常は短いオーディオ クリップ) に役立ちます。

より長いオーディオとビデオを再生するには、Media、MediaPlayer、および MediaView クラスを使用します。

MediaMediaPlayer クラスは、オーディオとビデオの再生に使用されます。 Media のインスタンス クラスは、オーディオまたはビデオなどのメディア リソースを表します。メディアの長さなど、メディアに関する情報を提供します。

MediaPlayer のインスタンス クラスは、メディアを再生するためのコントロールを提供します。

MediaView のインスタンス クラスは MediaPlayer によって再生されているメディアのビューを提供します . MediaView 動画の視聴に使用します。

メディアを再生しようとすると、いくつかの問題が発生する可能性があります。たとえば、メディア形式がサポートされていないか、メディア コンテンツが破損している可能性があります。

MediaException クラスのインスタンスは、メディアの再生中に発生する可能性がある特定の種類のメディア エラーを表します。メディア関連のエラーが発生すると、MediaErrorEvent が生成されます。
メディア オブジェクトに適切なイベント ハンドラを追加することで、エラーを処理できます。

2.オーディオ クリップの再生

2.1 コード

FxMediaExample1.java

import java.net.URL;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.AudioClip;
import javafx.stage.Stage;

public class FxMediaExample1 extends Application
{
	private AudioClip audioClip;
	
	public static void main(String[] args) 
	{
		Application.launch(args);
	}
	
	@Override
	public void init() 
	{
		// Create an AudioClip, which loads the audio data synchronously
		final URL resource = getClass().getResource("Test.mp3");
		audioClip = new AudioClip(resource.toExternalForm());
	}
	
	@Override
	public void start(Stage stage) 
	{
		// Create the Buttons
		Button playButton = new Button("Play");
		Button stopButton = new Button("Stop");
		
		// Create the Sliders
		final Slider cycleSlider = new Slider(1, 5, 1);
		cycleSlider.setMajorTickUnit(1);
		cycleSlider.setShowTickLabels(true);

		final Slider volumeSlider = new Slider(0.0, 1.0, 0.5);
		volumeSlider.setMajorTickUnit(0.1);
		volumeSlider.setShowTickLabels(true);

		final Slider rateSlider = new Slider(0, 8, 4);
		rateSlider.setMajorTickUnit(1);
		rateSlider.setShowTickLabels(true);

		final Slider balanceSlider = new Slider(-1.0, 1.0, 0.0);
		balanceSlider.setMajorTickUnit(0.2);
		balanceSlider.setShowTickLabels(true);

		final Slider panSlider = new Slider(-1.0, 1.0, 0.0);
		panSlider.setMajorTickUnit(0.2);
		panSlider.setShowTickLabels(true);

		final Slider prioritySlider = new Slider(0.0, 10.0, 0.0);
		prioritySlider.setMajorTickUnit(1);
		prioritySlider.setShowTickLabels(true);
		
		// Create the Event Handlers for the Button
		playButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	audioClip.play();
            }
        });		

		stopButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	audioClip.stop();
            }
        });		
		
		// Bind the Properties
		audioClip.cycleCountProperty().bind(cycleSlider.valueProperty());
		audioClip.volumeProperty().bind(volumeSlider.valueProperty());
		audioClip.rateProperty().bind(rateSlider.valueProperty());
		audioClip.balanceProperty().bind(balanceSlider.valueProperty());
		audioClip.panProperty().bind(panSlider.valueProperty());
		audioClip.priorityProperty().bind(prioritySlider.valueProperty());
		
		// Create the GridPane
		GridPane sliderPane = new GridPane();
		// Set horizontal and vertical Spacing
		sliderPane.setHgap(5);
		sliderPane.setVgap(10);
		
		// Add the details to the GridPane
		sliderPane.addRow(0, new Label("CycleCount:"), cycleSlider);
		sliderPane.addRow(1, new Label("Volume:"), volumeSlider);
		sliderPane.addRow(2, new Label("Rate:"), rateSlider);
		sliderPane.addRow(3, new Label("Balance:"), balanceSlider);
		sliderPane.addRow(4, new Label("Pan:"), panSlider);
		sliderPane.addRow(5, new Label("Priority:"), prioritySlider);
		
		// Create the HBox
		HBox buttonBox = new HBox(5, playButton, stopButton);
		
		VBox root = new VBox(5,sliderPane, buttonBox);
		// Set the Sie of the VBox
		root.setPrefWidth(300);
		root.setPrefHeight(350);
		
		// Set the Style-properties of the HBox
		root.setStyle("-fx-padding: 10;" +
				"-fx-border-style: solid inside;" +
				"-fx-border-width: 2;" +
				"-fx-border-insets: 5;" +
				"-fx-border-radius: 5;" +
				"-fx-border-color: blue;");

		// Create the Scene
		Scene scene = new Scene(root);
		// Add the scene to the Stage
		stage.setScene(scene);
		// Set the title of the Stage
		stage.setTitle("An AucioClip Example");
		// Display the Stage
		stage.show();		
	}	
}

AudioClip のインスタンス クラスは、最小限のレイテンシーで短いオーディオ クリップを再生するために使用されます。通常、これは短いオーディオ クリップを再生する場合に役立ちます。たとえば、ユーザーがエラーを起こしたときにビープ音を鳴らしたり、ゲーム アプリケーションで短い効果音を生成したりします。

AudioClip クラスは、URL を文字列形式で受け取るコンストラクターを 1 つだけ提供します。これは、オーディオ ソースの URL です。オーディオ クリップは、生の非圧縮形式ですぐにメモリにロードされます。これが、長時間再生するオーディオ クリップにこのクラスを使用しない理由です。

ソース URL では、HTTP、ファイル、および JAR プロトコルを使用できます。これは、インターネット、ローカル ファイル システム、および JAR ファイルからオーディオ クリップを再生できることを意味します。

次のコード スニペットは AudioClip を作成します :

// Create an AudioClip, which loads the audio data synchronously
final URL resource = getClass().getResource("Test.mp3");
audioClip = new AudioClip(resource.toExternalForm());

AudioClip の場合 オブジェクトが作成されると、オーディオ データがメモリにロードされ、すぐに再生できるようになります。 play() を使用 オーディオと stop() を再生するメソッド 再生を停止するメソッド:

/ Create the Event Handlers for the Button
playButton.setOnAction(new EventHandler <ActionEvent>() 
{
    public void handle(ActionEvent event) 
    {
	audioClip.play();
    }
});		

stopButton.setOnAction(new EventHandler <ActionEvent>() 
{
    public void handle(ActionEvent event) 
    {
	audioClip.stop();
    }
});		

AudioClip クラスは、クリップの再生時にいくつかのオーディオ プロパティの設定をサポートします:

  • サイクル数
  • ボリューム
  • 料金
  • バランス
  • パン
  • 優先度

cycleCount を除く上記のすべてのプロパティ 、 AudioClip で設定できます クラス。 play() への後続の呼び出し メソッドはそれらをデフォルトとして使用します。 play() メソッドは、特定の再生のデフォルトをオーバーライドすることもできます。 cycleCount プロパティは AudioClip で指定する必要があります 以降のすべての再生では同じ値が使用されます。 cycleCount play() のときにクリップを再生する回数を指定します。 メソッドが呼び出されます。デフォルトは 1 で、クリップを 1 回だけ再生します。

volume 再生の相対的な音量を指定します。有効な範囲は 0.0 ~ 1.0 です。値 0.0 はミュートを表し、1.0 はフル ボリュームを表します。

rate オーディオが再生される相対速度を指定します。有効な範囲は 0.125 ~ 8.0 です。値 0.125 はクリップが 8 倍遅く再生されることを意味し、値 8.0 はクリップが 8 倍速く再生されることを意味します。 rate プレイタイムとピッチに影響を与えます。デフォルトのレートは 1.0 で、通常の rate でクリップを再生します。 .

balance 左右のチャンネルの相対的な音量を指定します。有効な範囲は -1.0 ~ 1.0 です。 -1.0 の値は、左チャンネルの再生を通常の音量に設定し、右チャンネルをミュートします。値 1.0 は、右チャンネルの再生を通常の音量に設定し、左チャンネルをミュートします。デフォルト値は 0.0 で、両方のチャンネルの再生を通常の音量に設定します。

pan 左右のチャンネル間のクリップの分配を指定します。有効な範囲は -1.0 ~ 1.0 です。 -1.0 の値は、クリップ全体を左チャンネルにシフトします。 1.0 の値は、クリップ全体を右チャンネルにシフトします。デフォルト値は 0.0 で、クリップは通常どおり再生されます。 pan の値を設定する モノクリップの場合、バランスを設定するのと同じ効果があります。このプロパティの既定値は、ステレオ サウンドを使用するオーディオ クリップに対してのみ変更する必要があります。

priority 他のクリップに対するクリップの優先度を指定します。再生クリップ数がシステム制限を超えた場合にのみ使用されます。優先度の低い再生中のクリップは停止します。任意の整数に設定できます。デフォルトの優先度はゼロに設定されています。

play() メソッドがオーバーロードされています。 3 つのバージョンがあります:

  • void play()
  • ボイドプレイ(倍量)
  • ボイド プレイ (ダブル ボリューム、ダブル バランス、ダブル レート、ダブル パン、int プライオリティ)

このメソッドの引数なしバージョンは、AudioClip で設定されたすべてのプロパティを使用します。 .他の 2 つのバージョンは、特定の再生の指定されたプロパティをオーバーライドできます。

AudioClip のボリュームを想定します。 1.0 に設定されています。 play() を呼び出す ボリューム 1.0 でクリップを再生し、play(0.20) を呼び出します AudioClip のボリューム プロパティを残して、ボリューム 0.20 でクリップを再生します。 1.0 で変更されません。つまり、play() メソッド
パラメータを使用すると、AudioClip をオーバーライドできます 再生ごとのプロパティ。

AudioClip クラスに isPlaying() が含まれています クリップがまだ再生されているかどうかを確認するメソッド。クリップが再生中の場合は true を返します。それ以外の場合は false を返します。

2.2 GUI

簡単なオーディオ プレーヤーの例:

簡単な JavaFX AudioClip の例

3.メディアの再生

3.1 コード

FxMediaExample2.java

import java.net.URL;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayer.Status;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class FxMediaExample2 extends Application
{
	public static void main(String[] args) 
	{
		Application.launch(args);
	}
	
	@Override
	public void start(Stage stage) 
	{
		// Locate the media content in the CLASSPATH
		URL mediaUrl = getClass().getResource("Test.mp4");
		String mediaStringUrl = mediaUrl.toExternalForm();
		
		// Create a Media
		Media media = new Media(mediaStringUrl);
		
		// Create a Media Player
		final MediaPlayer player = new MediaPlayer(media);
		// Automatically begin the playback
		player.setAutoPlay(true);
		
		// Create a 400X300 MediaView
		MediaView mediaView = new MediaView(player);
		mediaView.setFitWidth(400);
		mediaView.setFitHeight(300);		
		mediaView.setSmooth(true);
		
		// Create the DropShadow effect
		DropShadow dropshadow = new DropShadow();
		dropshadow.setOffsetY(5.0);
		dropshadow.setOffsetX(5.0);
		dropshadow.setColor(Color.WHITE);

		mediaView.setEffect(dropshadow);		
		
		// Create the Buttons
		Button playButton = new Button("Play");
		Button stopButton = new Button("Stop");
		
		// Create the Event Handlers for the Button
		playButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	if (player.getStatus() == Status.PLAYING) 
            	{
            		player.stop();
            		player.play();
            	} 
            	else 
            	{
            		player.play();
            	}
            }
        });		

		stopButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	player.stop();
            }
        });		
		
		// Create the HBox
		HBox controlBox = new HBox(5, playButton, stopButton);
		
		// Create the VBox
		VBox root = new VBox(5,mediaView,controlBox);
		
		// Set the Style-properties of the HBox
		root.setStyle("-fx-padding: 10;" +
				"-fx-border-style: solid inside;" +
				"-fx-border-width: 2;" +
				"-fx-border-insets: 5;" +
				"-fx-border-radius: 5;" +
				"-fx-border-color: blue;");

		// Create the Scene
		Scene scene = new Scene(root);
		// Add the scene to the Stage
		stage.setScene(scene);
		// Set the title of the Stage
		stage.setTitle("A simple Media Example");
		// Display the Stage
		stage.show();		
	}	
}

JavaFX は、オーディオとビデオを操作するための統合 API を提供します。同じクラスを使用して両方を操作します。 Media API は、API ユーザーに対して透過的な 2 つの異なるタイプのメディアとして内部的にそれらを扱います。

Media API には、メディアを再生するための 3 つのコア クラスが含まれています。

  • メディア
  • メディアプレーヤー
  • MediaView

3.2 メディア オブジェクトの作成

Media のインスタンス クラスは、オーディオまたはビデオなどのメディア リソースを表します。期間、メタデータ、データなど、メディアに関連する情報を提供します。

メディアがビデオの場合、ビデオの幅と高さを提供します。 Media オブジェクトは不変です。次のコードのように、メディア リソースのパスを含む文字列を指定することで作成されます:

// Locate the media content in the CLASSPATH
URL mediaUrl = getClass().getResource("Test.mp4");
String mediaStringUrl = mediaUrl.toExternalForm();

// Create a Media
Media media = new Media(mediaStringUrl);

Media クラスには、読み取り専用の次のプロパティが含まれています:

  • 期間
  • 身長
  • エラー
  • onError

duration メディアの長さを秒単位で指定します。 Duration オブジェクトです。期間が不明な場合は、Duration.UNKNOWN です。 .

widthheight ソースメディアの幅と高さをそれぞれピクセル単位で指定します。メディアに幅と高さがない場合、それらはゼロに設定されます。

erroronError プロパティが関連しています。 error プロパティは MediaException を表します メディアのロード中に発生します。 onError エラーが発生したときに通知を受け取るように設定できる Runnable オブジェクトです。 run() Runnable のメソッド エラーが発生したときに呼び出されます。

3.3 MediaPlayer オブジェクトの作成

MediaPlayer メディアを再生するための、再生、一時停止、停止、シーク、再生速度、音量調整などのコントロールを提供します。 MediaPlayer Media を取るコンストラクタを 1 つだけ提供します 引数としてのオブジェクト:

// Create a Media Player
final MediaPlayer player = new MediaPlayer(media);

MediaPlayer からメディアのリファレンスを取得できます getMedia() を使用 MediaPlayer のメソッド クラス。

Media のように クラス、MediaPlayer クラスには error も含まれています と onError エラーを報告するプロパティ。 MediaPlayerでエラーが発生した場合 、同じエラーが Media でも報告されています 物体。

3.4 MediaView ノードの作成

MediaView ノードです。 MediaPlayer で再生されているメディアのビューを提供します .オーディオ クリップにはビジュアルがないことに注意してください。 MediaView を作成しようとすると オーディオ コンテンツの場合は空になります。ビデオを見るには、MediaView を作成します シーン グラフに追加します。

MediaView クラスは 2 つのコンストラクターを提供します。

1 つの引数のないコンストラクターと、MediaPlayer を取るコンストラクター 引数として:

  • public MediaView()
  • public MediaView(MediaPlayer mediaPlayer)

引数なしのコンストラクターは MediaView を作成します MediaPlayer に接続されている . MediaPlayer を設定する必要があります mediaPlayer のセッターを使用する プロパティ:

// Create a 400X300 MediaView
MediaView mediaView = new MediaView();
mediaView.setMediaPlayer(player);
mediaView.setFitWidth(400);
mediaView.setFitHeight(300);		

他のコンストラクターでは、 MediaPlayer を指定できます MediaView の場合 :

// Create a 400X300 MediaView
MediaView mediaView = new MediaView(player);
mediaView.setFitWidth(400);
mediaView.setFitHeight(300);		

3.5 MediaView のカスタマイズ

メディアにビュー (ビデオなど) がある場合、次のプロパティを使用して、ビデオのサイズ、領域、および品質をカスタマイズできます。

  • フィットハイト
  • フィット幅
  • preserveRatio
  • スムーズ
  • ビューポート
  • ×
  • はい

fitWidthfitHeight プロパティは、ビデオのサイズ変更された幅と高さをそれぞれ指定します。デフォルトではゼロで、メディアの元の幅と高さが使用されることを意味します。

mediaView.setfitWidth(400);
mediaView.setFitHeight(300);		

preserveRatio プロパティは、サイズ変更中にメディアの縦横比を維持するかどうかを指定します。デフォルトでは、false です。

smooth プロパティは、ビデオのサイズ変更に使用されるフィルタリング アルゴリズムの品質を指定します。デフォルト値はプラットフォームに依存します。 true に設定すると、より高品質のフィルタリング アルゴリズムが使用されます。

mediaView.setSmooth(true);

viewport グラフィックの一部を表示するための長方形の領域です。 viewportx 、および y プロパティを組み合わせて、MediaView に表示されるビデオの長方形の領域を指定できます。 .

MediaView Node です .したがって、視聴者により良い視覚体験を提供するために、MediaView に効果と変換を適用することもできます。 .

3.6 Media、MediaPlayer、MediaView の組み合わせ

メディアのコンテンツは、複数の Media で同時に使用できます オブジェクト。ただし、1 つの Media オブジェクトは、その存続期間中に 1 つのメディア コンテンツにのみ関連付けることができます。

Media オブジェクトは複数の MediaPlayer に関連付けることができます オブジェクト。ただし、MediaPlayer 1 つの Media のみに関連付けられています その生涯で。

MediaView オプションで MediaPlayer に関連付けることができます .もちろん、MediaView MediaPlayer に関連付けられていない ビジュアルはありません。 MediaPlayer MediaView の場合 変更可能。

MediaPlayer の変更 MediaView の場合 テレビのチャンネルを変えるのと同じです。 MediaView のビュー 現在の MediaPlayer で提供されます .同じ MediaPlayer を関連付けることができます 複数の MediaView を使用:

異なる MediaView は、再生中に同じメディアの異なる部分を表示する場合があります。

3.7 GUI

次の画像は、MediaPlayer の GUI を示しています。 :

JavaFX MediaView の例

4.再生エラーの処理

4.1 コード

FxMediaExample3.java

import java.net.URL;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaErrorEvent;
import javafx.scene.media.MediaException;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayer.Status;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class FxMediaExample3 extends Application
{
	// Create the Area for Logging
	private TextArea messageArea = new TextArea();
	
	public static void main(String[] args) 
	{
		Application.launch(args);
	}
	
	@Override
	public void start(Stage stage) 
	{
		// Locate the media content in the CLASSPATH
		URL mediaUrl = getClass().getResource("Test.mp4");
		String mediaStringUrl = mediaUrl.toExternalForm();
		
		// Create a Media
		final Media media = new Media(mediaStringUrl);
		
		// Create a Media Player
		final MediaPlayer player = new MediaPlayer(media);
		// Automatically begin the playback
		player.setAutoPlay(true);
		
		// Create a 400X300 MediaView
		final MediaView mediaView = new MediaView(player);
		mediaView.setFitWidth(400);
		mediaView.setFitHeight(300);		
		mediaView.setSmooth(true);
		
		// Create the DropShadow effect
		DropShadow dropshadow = new DropShadow();
		dropshadow.setOffsetY(5.0);
		dropshadow.setOffsetX(5.0);
		dropshadow.setColor(Color.WHITE);

		mediaView.setEffect(dropshadow);		
		
		// Create the Buttons
		Button playButton = new Button("Play");
		Button stopButton = new Button("Stop");
		
		// Create the Event Handlers for the Button
		playButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	if (player.getStatus() == Status.PLAYING) 
            	{
            		player.stop();
            		player.play();
            	} 
            	else 
            	{
            		player.play();
            	}
            }
        });		

		stopButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	player.stop();
            }
        });		
		
		// Create Handlers for handling Errors
		player.setOnError(new Runnable() 
		{
            public void run() 
            {
                // Handle asynchronous error in Player object.
            	printMessage(player.getError());
            }
        });

		media.setOnError(new Runnable() 
		{
            public void run() 
            {
                // Handle asynchronous error in Media object.
            	printMessage(media.getError());
            }
        });

		mediaView.setOnError(new EventHandler <MediaErrorEvent>()
		{
			public void handle(MediaErrorEvent event) 
			{
                // Handle asynchronous error in MediaView.
            	printMessage(event.getMediaError());
            }
		});
		
		// Create the HBox
		HBox controlBox = new HBox(5, playButton, stopButton);
		
		// Create the VBox
		VBox root = new VBox(5,mediaView,controlBox,messageArea);
		
		// Set the Style-properties of the HBox
		root.setStyle("-fx-padding: 10;" +
				"-fx-border-style: solid inside;" +
				"-fx-border-width: 2;" +
				"-fx-border-insets: 5;" +
				"-fx-border-radius: 5;" +
				"-fx-border-color: blue;");

		// Create the Scene
		Scene scene = new Scene(root);
		// Add the scene to the Stage
		stage.setScene(scene);
		// Set the title of the Stage
		stage.setTitle("Handling Media Errors");
		// Display the Stage
		stage.show();		
	}		
	
	private void printMessage(MediaException error)
	{
		MediaException.Type errorType = error.getType();
		String errorMessage = error.getMessage();
		messageArea.appendText("\n" + "Type:" + errorType + ", error mesage:" + errorMessage);
	}
}

MediaException のインスタンス クラスは、RuntimeException クラスから継承され、Media で発生する可能性があるメディア エラーを表します。 、 MediaPlayer 、および MediaView .

Media 再生は、さまざまな理由で失敗する場合があります。 API ユーザーは、特定のエラーを識別できる必要があります。 MediaException クラスは静的な列挙型 MediaException.Type を定義します その定数はエラーのタイプを識別します。 MediaException クラスに getType() が含まれています MediaException.Type の定数の 1 つを返すメソッド 列挙。

MediaException.Type の定数 列挙型は以下のとおりです:

  • MEDIA_CORRUPTED
  • MEDIA_INACESSIBLE
  • MEDIA_UNAVAILABLE
  • MEDIA_UNSPECIFIED
  • MEDIA_UNSUPPORTED
  • OPERATION_UNSUPPORTED
  • PLAYBACK_HALTED
  • PLAYBACK_ERROR
  • 不明

MEDIA_CORRUPTED エラー タイプは、メディアが破損しているか無効であることを示します。

MEDIA_INACCESSIBLE エラー タイプは、メディアにアクセスできないことを示します。ただし、メディアは存在する可能性があります。

MEDIA_UNAVAILABLE エラー タイプは、そのメディアが存在しないか、使用できないことを示します。

MEDIA_UNSPECIFIED エラー タイプは、メディアが指定されていないことを示します。

MEDIA_UNSUPPORTED エラー タイプは、メディアがプラットフォームでサポートされていないことを示します。

OPERATION_UNSUPPORTED エラー タイプは、メディアで実行された操作がプラットフォームでサポートされていないことを示します。

PLAYBACK_HALTED エラー タイプは、再生を停止させた回復不能なエラーを示します。

PLAYBACK_ERROR エラー タイプは、記述されている他のどのカテゴリにも分類されない再生エラーを示します。

UNKNOWN error type は、不明なエラーが発生したことを示します。

MediaMediaPlayer クラスに MediaException のエラー プロパティが含まれている . 3 つのクラスすべてに onError が含まれています これは、エラーが発生したときに呼び出されるイベント ハンドラーです。これらのクラスの onError プロパティの型は一貫していません。

Runnable です Media の場合 と MediaPlayer クラスと MediaErrorEvent MediaView の場合 クラス。

次のコード スニペットは、Media でエラーを処理する方法を示しています。 、 MediaPlayer 、および MediaView .

// Create Handlers for handling Errors
player.setOnError(new Runnable() 
{
    public void run() 
    {
	// Handle asynchronous error in Player object.
	printMessage(player.getError());
    }
});

media.setOnError(new Runnable() 
{
    public void run() 
    {
	// Handle asynchronous error in Media object.
	printMessage(media.getError());
    }
});

mediaView.setOnError(new EventHandler <MediaErrorEvent>()
{
    public void handle(MediaErrorEvent event) 
    {
	// Handle asynchronous error in MediaView.
	printMessage(event.getMediaError());
    }
});

Media エラー ハンドラは、JavaFX アプリケーション スレッドで呼び出されます。したがって、ハンドラから Scene Graph を更新しても安全です。

Media の作成を同封することをお勧めします。 、 MediaPlayer 、および MediaView オブジェクトを try-catch ブロックに入れ、例外を適切に処理します。 onError これらのオブジェクトのハンドラーは、オブジェクトの作成後に関与します。これらのオブジェクトの作成中にエラーが発生すると、それらのハンドラーは使用できなくなります。

4.2 GUI

次の GUI は MediaPlayer を示しています エラー処理あり:

エラー処理を含む JavaFX メディアの例

5. MediaPlayer の状態遷移

5.1 コード

FxMediaExample4.java

import java.net.URL;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaErrorEvent;
import javafx.scene.media.MediaException;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayer.Status;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class FxMediaExample4 extends Application
{
	// Create the Area for Logging
	private TextArea messageArea = new TextArea();
	
	public static void main(String[] args) 
	{
		Application.launch(args);
	}
	
	@Override
	public void start(Stage stage) 
	{
		// Locate the media content in the CLASSPATH
		URL mediaUrl = getClass().getResource("Test.mp4");
		String mediaStringUrl = mediaUrl.toExternalForm();
		
		// Create a Media
		final Media media = new Media(mediaStringUrl);
		
		// Create a Media Player
		final MediaPlayer player = new MediaPlayer(media);
		// Automatically begin the playback
		player.setAutoPlay(true);
		
		// Create a 400X300 MediaView
		final MediaView mediaView = new MediaView(player);
		mediaView.setFitWidth(400);
		mediaView.setFitHeight(300);		
		mediaView.setSmooth(true);
		
		// Create the DropShadow effect
		DropShadow dropshadow = new DropShadow();
		dropshadow.setOffsetY(5.0);
		dropshadow.setOffsetX(5.0);
		dropshadow.setColor(Color.WHITE);

		mediaView.setEffect(dropshadow);		
		
		// Create the Buttons
		Button playButton = new Button("Play");
		Button stopButton = new Button("Stop");
		
		// Create the Event Handlers for the Button
		playButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	if (player.getStatus() == Status.PLAYING) 
            	{
            		player.stop();
            		player.play();
            	} 
            	else 
            	{
            		player.play();
            	}
            }
        });		

		stopButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	player.stop();
            }
        });		
		
		// Create Handlers for handling Errors
		player.setOnError(new Runnable() 
		{
            public void run() 
            {
                // Handle asynchronous error in Player object.
            	printMessage(player.getError());
            }
        });

		media.setOnError(new Runnable() 
		{
            public void run() 
            {
                // Handle asynchronous error in Media object.
            	printMessage(media.getError());
            }
        });

		mediaView.setOnError(new EventHandler <MediaErrorEvent>()
		{
			public void handle(MediaErrorEvent event) 
			{
                // Handle asynchronous error in MediaView.
            	printMessage(event.getMediaError());
            }
		});
		
		// Add a ChangeListener to the player
		player.statusProperty().addListener(new ChangeListener<MediaPlayer.Status>() 
		{
			// Log the Message
		    public void changed(ObservableValue<? extends MediaPlayer.Status> ov,
		            final MediaPlayer.Status oldStatus, final MediaPlayer.Status newStatus) 
		    {
		    	messageArea.appendText("\nStatus changed from " + oldStatus + " to " + newStatus);
		    }
		});
		
		// Add a Handler for PLAYING status
		player.setOnPlaying(new Runnable() 
		{
            public void run() 
            {
            	messageArea.appendText("\nPlaying now");
            }
		});
		
		// Add a Handler for STOPPED status
		player.setOnStopped(new Runnable() 
		{
            public void run() 
            {
            	messageArea.appendText("\nStopped now");
            }
		});
		
		// Create the HBox
		HBox controlBox = new HBox(5, playButton, stopButton);
		
		// Create the VBox
		VBox root = new VBox(5,mediaView,controlBox,messageArea);
		
		// Set the Style-properties of the HBox
		root.setStyle("-fx-padding: 10;" +
				"-fx-border-style: solid inside;" +
				"-fx-border-width: 2;" +
				"-fx-border-insets: 5;" +
				"-fx-border-radius: 5;" +
				"-fx-border-color: blue;");

		// Create the Scene
		Scene scene = new Scene(root);
		// Add the scene to the Stage
		stage.setScene(scene);
		// Set the title of the Stage
		stage.setTitle("A State Transition Example");
		// Display the Stage
		stage.show();		
	}		
	
	private void printMessage(MediaException error)
	{
		MediaException.Type errorType = error.getType();
		String errorMessage = error.getMessage();
		messageArea.appendText("\n" + "Type:" + errorType + ", error mesage:" + errorMessage);
	}
}

MediaPlayer 常にステータスがあります。 MediaPlayer の現在のステータス 読み取り専用の status で示されます 財産。 MediaPlayer でアクションが実行されると、ステータスが変化します .直接設定することはできません。 MediaPlayer のステータス MediaPlayer.Status の 8 つの定数の 1 つによって定義されます。 列挙:

  • 不明
  • 準備完了
  • 遊ぶ
  • 一時停止
  • 失速
  • 停止しました
  • 中止
  • 処分する

MediaPlayer 次のいずれかのメソッドが呼び出されると、あるステータスから別のステータスに遷移します:

  • play()
  • 一時停止()
  • ストップ()
  • dispose()

MediaPlayer の場合 が作成され、ステータスは UNKNOWN です .メディアがプリロールされ、再生する準備が整うと、MediaPlayer UNKNOWN からの遷移 READY へ .一度 MediaPlayer UNKNOWN を終了します 状態である場合、その存続期間内に再入力することはできません。

MediaPlayer PLAYING への移行 play() のときのステータス メソッドが呼び出されます。このステータスは、メディアが再生中であることを示します。 autoPlay プロパティが true に設定されている場合、MediaPlayer PLAYING を入力できます play() を呼び出さないステータス 作成後に明示的にメソッドを呼び出します。

MediaPlayer のとき STALLED に入る可能性があります 再生するのに十分なデータがバッファにない場合のステータス。このステータスは、MediaPlayer データをバッファリングしています。十分なデータがバッファリングされると、PLAYING に戻ります 状態。

MediaPlayer の場合 pause() を呼び出して停止しています と stop() PAUSED に遷移します と STOPPED 状態、それぞれ。その場合、バッファリングは続行されます。ただし、MediaPlayer PLAYING に移行しません 十分なデータがバッファリングされると、ステータス。むしろ、PAUSED のままです または STOPPED 状態。

paused() を呼び出す メソッドは MediaPlayer を遷移します PAUSED に 状態。 stop() に電話する メソッドは MediaPlayer を遷移します STOPPED に 状態。

回復不能なエラーの場合、MediaPlayer HALTEDへの移行 ターミナル状態。このステータスは、MediaPlayer 再度使用することはできません。新しい MediaPlayer を作成する必要があります メディアをもう一度再生したい場合。

dispose() メソッドは、MediaPlayer に関連付けられたすべてのリソースを解放します .しかし、Media
MediaPlayerで使用されたオブジェクト まだ使用できます。 dispose() を呼び出す メソッドは MediaPlayer を移行します ターミナルステータス DISPOSED へ .

MediaPlayer のステータスを表示するのが一般的です アプリケーションで。 status に ChangeListener を追加します ステータスの変更をリッスンするプロパティ。

通常、MediaPlayer の状態になったときに通知を受け取りたいと思うでしょう。 変化します。通知を受け取る方法は 2 つあります。

  • ステータス プロパティに ChangeListener を追加する
  • ステータス変更ハンドラを設定する

最初の方法は、あらゆる種類のステータス変更をリッスンすることに関心がある場合に適しています。次のコード スニペットは、このメソッドを示しています:

// Add a ChangeListener to the player
player.statusProperty().addListener(new ChangeListener<MediaPlayer.Status>() 
{
	// Log the Message
    public void changed(ObservableValue<? extends MediaPlayer.Status> ov,
	    final MediaPlayer.Status oldStatus, final MediaPlayer.Status newStatus) 
    {
	messageArea.appendText("\nStatus changed from " + oldStatus + " to " + newStatus);
    }
});

2 番目の方法は、特定のタイプのステータス変更を処理することに関心がある場合に適しています。 MediaPlayer クラスには、Runnable に設定できる次のプロパティが含まれています オブジェクト:

  • オンレディ
  • プレイ中
  • オンリピート
  • 停滞中
  • onPaused
  • 停止中
  • 停止中

run() Runnable の方法 オブジェクトは MediaPlayer のときに呼び出されます 特定の状態に入ります。

たとえば、run() onPlaying の方法 プレイヤーが PLAYING に入ると、ハンドラが呼び出されます 状態。

次のコード スニペットは、特定のタイプのステータス変更のハンドラーを設定する方法を示しています:

// Add a Handler for PLAYING status
player.setOnPlaying(new Runnable() 
{
	public void run() 
	{
		messageArea.appendText("\nPlaying now");
	}
});

// Add a Handler for STOPPED status
player.setOnStopped(new Runnable() 
{
	public void run() 
	{
	messageArea.appendText("\nStopped now");
	}
});

5.2 GUI

次の GUI は MediaPlayer を示しています 状態遷移あり:

状態遷移を伴う JavaFX メディアの例

6.メディア プロパティの制御

6.1 コード

FxMediaExample5.java

import java.net.URL;
import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.control.TextArea;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayer.Status;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class FxMediaExample5 extends Application
{
	// Create the Area for Logging
	private TextArea messageArea = new TextArea();
	
	public static void main(String[] args) 
	{
		Application.launch(args);
	}
	
	@Override
	public void start(Stage stage) 
	{
		// Create the Sliders
		final Slider cycleSlider = new Slider(1, 5, 1);
		cycleSlider.setMajorTickUnit(1);
		cycleSlider.setShowTickLabels(true);

		final Slider volumeSlider = new Slider(0.0, 1.0, 0.5);
		volumeSlider.setMajorTickUnit(0.1);
		volumeSlider.setShowTickLabels(true);
		
		final Slider rateSlider = new Slider(0, 8, 4);
		rateSlider.setMajorTickUnit(1);
		rateSlider.setShowTickLabels(true);

		final Slider balanceSlider = new Slider(-1.0, 1.0, 0.0);
		balanceSlider.setMajorTickUnit(0.2);
		balanceSlider.setShowTickLabels(true);

		// Locate the media content in the CLASSPATH
		URL mediaUrl = getClass().getResource("Test.mp4");
		String mediaStringUrl = mediaUrl.toExternalForm();
		
		// Create a Media
		final Media media = new Media(mediaStringUrl);
		
		// Create a Media Player
		final MediaPlayer player = new MediaPlayer(media);
		// Automatically begin the playback
		player.setAutoPlay(true);
		
		// Create a 400X300 MediaView
		final MediaView mediaView = new MediaView(player);
		mediaView.setFitWidth(400);
		mediaView.setFitHeight(300);		
		mediaView.setSmooth(true);
		
		// Create the DropShadow effect
		DropShadow dropshadow = new DropShadow();
		dropshadow.setOffsetY(5.0);
		dropshadow.setOffsetX(5.0);
		dropshadow.setColor(Color.WHITE);

		mediaView.setEffect(dropshadow);		
		
		// Create the Buttons
		Button playButton = new Button("Play");
		Button stopButton = new Button("Stop");
		
		// Create the Event Handlers for the Button
		playButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	if (player.getStatus() == Status.PLAYING) 
            	{
            		player.stop();
            		player.play();
            	} 
            	else 
            	{
            		player.play();
            	}
            }
        });		

		stopButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	player.stop();
            }
        });		
		
		// Create the Listener for the Sliders
		cycleSlider.valueProperty().addListener(new InvalidationListener()
		{
			@Override
			public void invalidated(Observable ov) 
			{
				if (cycleSlider.isValueChanging()) 
				{
					messageArea.appendText("\nCycle Count changed to: " + (int)cycleSlider.getValue());
					player.setCycleCount((int)cycleSlider.getValue());
				}
			}
		});
		
		volumeSlider.valueProperty().addListener(new InvalidationListener()
		{
			@Override
			public void invalidated(Observable ov) 
			{
				if (volumeSlider.isValueChanging()) 
				{
					messageArea.appendText("\nVolume changed to: " + volumeSlider.getValue());
					player.setVolume(volumeSlider.getValue());
				}
			}
		});

		rateSlider.valueProperty().addListener(new InvalidationListener()
		{
			@Override
			public void invalidated(Observable ov) 
			{
				if (rateSlider.isValueChanging()) 
				{
					messageArea.appendText("\nRate changed to: " + rateSlider.getValue());
					player.setRate(rateSlider.getValue());
				}
			}
		});

		balanceSlider.valueProperty().addListener(new InvalidationListener()
		{
			@Override
			public void invalidated(Observable ov) 
			{
				if (balanceSlider.isValueChanging()) 
				{
					messageArea.appendText("\nBalance changed to: " + balanceSlider.getValue());
					player.setVolume(balanceSlider.getValue());
				}
			}
		});
		
		// Add Handlers for End and Repeat
		player.setOnEndOfMedia(new Runnable()
		{
            public void run() 
            {
            	messageArea.appendText("\nEnd of media !");
            }
		});

		player.setOnRepeat(new Runnable()
		{
            public void run() 
            {
            	messageArea.appendText("\nRepeating media !");
            }
		});
		
		// Create the GridPane
		GridPane sliderPane = new GridPane();
		// Set horizontal and vertical Spacing
		sliderPane.setHgap(5);
		sliderPane.setVgap(10);
		
		// Add the details to the GridPane
		sliderPane.addRow(0, new Label("CycleCount:"), cycleSlider);
		sliderPane.addRow(1, new Label("Volume:"), volumeSlider);
		sliderPane.addRow(2, new Label("Rate:"), rateSlider);
		sliderPane.addRow(3, new Label("Balance:"), balanceSlider);
		
		// Create the HBox
		HBox controlBox = new HBox(5, playButton, stopButton);
		
		// Create the VBox
		VBox root = new VBox(5,mediaView,controlBox,sliderPane,messageArea);
		
		// Set the Style-properties of the HBox
		root.setStyle("-fx-padding: 10;" +
				"-fx-border-style: solid inside;" +
				"-fx-border-width: 2;" +
				"-fx-border-insets: 5;" +
				"-fx-border-radius: 5;" +
				"-fx-border-color: blue;");

		// Create the Scene
		Scene scene = new Scene(root);
		// Add the scene to the Stage
		stage.setScene(scene);
		// Set the title of the Stage
		stage.setTitle("A Media Properties Example");
		// Display the Stage
		stage.show();		
	}		
}

6.2 メディア再生の繰り返し

メディアは、指定された回数または無期限に繰り返し再生できます。 cycleCount プロパティは、再生が繰り返される回数を指定します。デフォルトでは 1 に設定されています。MediaPlayer.INDEFINITE に設定します。 プレーヤーが一時停止または停止するまで、無期限に再生を繰り返します。読み取り専用の currentCount プロパティは、完了した再生サイクルの数に設定されます。メディアが最初のサイクルを再生しているときは 0 に設定されます。最初のサイクルの終わりに、1 に設定されます。 2 番目のサイクルの最後に 2 にインクリメントされ、以降も同様です。

次のコードは、再生サイクルを 4 回に設定します:

// The playback should repeat 4 times
player.setCycleCount(4);

再生中のサイクルのメディアの終わりに達したときに、通知を受け取ることができます。 Runnable を設定します onEndOfMedia の場合 MediaPlayer のプロパティ 通知を受け取るクラス。再生が 4 サイクル続く場合、メディア終了通知が 4 回送信されることに注意してください。

// Add Handlers for End and Repeat
player.setOnEndOfMedia(new Runnable()
{
	public void run() 
	{
		messageArea.appendText("\nEnd of media !");
	}
});

onRepeat を追加できます 再生サイクルのメディアの終わりに達し、再生が繰り返されるときに呼び出されるイベント ハンドラー。 onEndOfMedia の後に呼び出されます イベント ハンドラ:

player.setOnRepeat(new Runnable()
{
	public void run() 
	{
		messageArea.appendText("\nRepeating media !");
	}
});

6.3 再生速度の制御

rate MediaPlayer のプロパティ 再生速度を指定します。有効な範囲は 0.0 ~ 8.0 です。たとえば、レートが 2.0 の場合、メディアは通常のレートの 2 倍の速さで再生されます。デフォルト値は 1.0 で、通常の速度でメディアを再生します。読み取り専用の currentRate プロパティは、現在の再生レートです。

次のコードは、レートを通常のレートの 3 倍に設定します:

player.setRate(3.0);

6.4 再生音量の制御

MediaPlayer の 3 つのプロパティ メディアのオーディオの音量を制御するクラス:

  • ボリューム
  • ミュート
  • バランス

volume オーディオの音量を指定します。範囲は 0.0 ~ 1.0 です。値 0.0 では音声が聞こえなくなり、値 1.0 ではフル ボリュームで再生されます。デフォルト値は 1.0 です。

mute オーディオが MediaPlayer によって生成されるかどうかを指定します .デフォルトでは、その値は false で、オーディオが生成されます。 true に設定すると、オーディオは生成されません。ミュート プロパティを設定しても、ボリューム プロパティには影響しないことに注意してください。

ボリュームが 1.0 に設定され、ミュートが true に設定されているとします。
音声は生成されていません。ミュートが false に設定されている場合、オーディオはボリューム プロパティ 1.0 を使用し、フル ボリュームで再生されます。次のコードは音量を半分に設定します:

player.setVolumne(0.5);
player.setMute(true)

balance 左右のチャンネルの相対的な音量を指定します。有効な範囲は -1.0 ~ 1.0 です。 -1.0 の値は、左チャンネルの再生を通常の音量に設定し、右チャンネルをミュートします。値 1.0 は、右チャンネルの再生を通常の音量に設定し、左チャンネルをミュートします。デフォルト値は 0.0 で、両方のチャンネルの再生を通常の音量に設定します。

6.5 GUI

次の GUI は MediaPlayer を示しています プロパティ付き:

プロパティを含む JavaFX メディアの例

7.メディア時間の追跡

7.1 コード

FxMediaExample6.java

import java.net.URL;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayer.Status;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;

public class FxMediaExample6 extends Application
{
	public static void main(String[] args) 
	{
		Application.launch(args);
	}
	
	@Override
	public void start(Stage stage) 
	{
		// Locate the media content in the CLASSPATH
		URL mediaUrl = getClass().getResource("Test.mp4");
		String mediaStringUrl = mediaUrl.toExternalForm();
		
		// Create a Media
		final Media media = new Media(mediaStringUrl);
				
		// Create a Media Player
		final MediaPlayer player = new MediaPlayer(media);
		// Automatically begin the playback
		player.setAutoPlay(true);
		
		// Set the Times of the Player
		player.setStartTime(Duration.minutes(1));
		player.setStopTime(Duration.minutes(2));
		
		// Create a 400X300 MediaView
		final MediaView mediaView = new MediaView(player);
		mediaView.setFitWidth(400);
		mediaView.setFitHeight(300);	
		mediaView.setSmooth(true);
		
		// Create the DropShadow effect
		DropShadow dropshadow = new DropShadow();
		dropshadow.setOffsetY(5.0);
		dropshadow.setOffsetX(5.0);
		dropshadow.setColor(Color.WHITE);

		mediaView.setEffect(dropshadow);		
		
		// Create the Buttons
		Button playButton = new Button("Play");
		Button stopButton = new Button("Stop");
		
		// Create the Event Handlers for the Button
		playButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	if (player.getStatus() == Status.PLAYING) 
            	{
            		player.stop();
            		player.play();
            	} 
            	else 
            	{
            		player.play();
            	}
            }
        });		

		stopButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	player.stop();
            }
        });		
				
		// Create the HBox
		HBox controlBox = new HBox(5, playButton, stopButton);
		
		// Create the VBox
		VBox root = new VBox(5,mediaView,controlBox);
		
		// Set the Style-properties of the HBox
		root.setStyle("-fx-padding: 10;" +
				"-fx-border-style: solid inside;" +
				"-fx-border-width: 2;" +
				"-fx-border-insets: 5;" +
				"-fx-border-radius: 5;" +
				"-fx-border-color: blue;");

		// Create the Scene
		Scene scene = new Scene(root);
		// Add the scene to the Stage
		stage.setScene(scene);
		// Set the title of the Stage
		stage.setTitle("A Tracking Media Example");
		// Display the Stage
		stage.show();		
	}		
}

メディアの継続時間と再生の経過時間を表示することは、視聴者にとって重要なフィードバックです。優れたメディア再生ダッシュボードを開発するには、これらの期間の種類をよく理解することが重要です。

Duration のさまざまな種類 メディアに関連付けることができます:

  • メディアを再生しているメディアの現在の長さ
  • メディアの再生時間
  • 1 サイクルのメディア再生時間
  • 開始オフセット時間
  • 終了オフセット時間
  • 停止中
  • 停止中
  • 処分する

デフォルトでは、メディアは元の期間だけ再生されます。たとえば、メディアの継続時間が 30 分の場合、メディアは 1 サイクルで 30 分間再生されます。 MediaPlayer Duration のどこでも再生の長さを指定できます メディアの。たとえば、再生サイクルごとに、メディアの中間の 10 分間 (11 番目から 12 番目) のみを再生するように指定できます。メディア再生の長さは、MediaPlayer の次の 2 つのプロパティによって指定されます。 クラス:

  • 開始時間
  • ストップタイム

両方のプロパティは Duration のものです タイプ。 startTimestopTime メディアが各サイクルで再生を開始および停止する時間オフセットです。デフォルトでは、startTime は Duration.ZERO に設定されています そして stopTime メディアの長さに設定されます。

次のコード スニペットはこれらのプロパティを設定するため、メディアは 1 分目から 2 分目まで再生されます:

// Set the Times of the Player
player.setStartTime(Duration.minutes(1));
player.setStopTime(Duration.minutes(2));

7.2 GUI

次の GUI は MediaPlayer を示しています タイムトラッキング:

メディア タイム トラッキングを使用した JavaFX メディアの例

8.メディアでの位置付け

8.1 コード

FxMediaExample7.java

import java.net.URL;
import javafx.application.Application;
import javafx.collections.ObservableMap;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaMarkerEvent;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayer.Status;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;
import javafx.util.Pair;

public class FxMediaExample7 extends Application
{
	// Create the Area for Logging
	private TextArea messageArea = new TextArea();
	
	public static void main(String[] args) 
	{
		Application.launch(args);
	}
	
	@Override
	public void start(Stage stage) 
	{
		// Locate the media content in the CLASSPATH
		URL mediaUrl = getClass().getResource("Test.mp4");
		String mediaStringUrl = mediaUrl.toExternalForm();
		
		// Create a Media
		final Media media = new Media(mediaStringUrl);
				
		// Create the Markers
		ObservableMap<String, Duration> markers = media.getMarkers();
		markers.put("START", Duration.ZERO);
		markers.put("INTERVAL", media.getDuration().divide(2.0));
		markers.put("END", media.getDuration());
		
		// Create a Media Player
		final MediaPlayer player = new MediaPlayer(media);
		// Automatically begin the playback
		player.setAutoPlay(true);
		
		// Create a 400X300 MediaView
		final MediaView mediaView = new MediaView(player);
		mediaView.setFitWidth(400);
		mediaView.setFitHeight(300);	
		mediaView.setSmooth(true);
		
		// Create the DropShadow effect
		DropShadow dropshadow = new DropShadow();
		dropshadow.setOffsetY(5.0);
		dropshadow.setOffsetX(5.0);
		dropshadow.setColor(Color.WHITE);
		
		// Set the Effect on the MediaView
		mediaView.setEffect(dropshadow);		
		
		// Create the Buttons
		Button playButton = new Button("Play");
		Button stopButton = new Button("Stop");
		
		// Create the Event Handlers for the Button
		playButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	if (player.getStatus() == Status.PLAYING) 
            	{
            		player.stop();
            		player.play();
            	} 
            	else 
            	{
            		player.play();
            	}
            }
        });		

		stopButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	player.stop();
            }
        });		
				
		// Add a marker event handler
		player.setOnMarker(new EventHandler <MediaMarkerEvent>() 
		{
            public void handle(MediaMarkerEvent event) 
            {
    			Pair<String, Duration> marker = event.getMarker();
    			String markerText = marker.getKey();
    			Duration markerTime = marker.getValue();
    			messageArea.appendText("\nReached the marker " + markerText + " at " + markerTime);
            }
		});
		
		// Create the HBox
		HBox controlBox = new HBox(5, playButton, stopButton);
		
		// Create the VBox
		VBox root = new VBox(5,mediaView,controlBox,messageArea);
		
		// Set the Style-properties of the HBox
		root.setStyle("-fx-padding: 10;" +
				"-fx-border-style: solid inside;" +
				"-fx-border-width: 2;" +
				"-fx-border-insets: 5;" +
				"-fx-border-radius: 5;" +
				"-fx-border-color: blue;");

		// Create the Scene
		Scene scene = new Scene(root);
		// Add the scene to the Stage
		stage.setScene(scene);
		// Set the title of the Stage
		stage.setTitle("A Markers Example");
		// Display the Stage
		stage.show();		
	}		
}

メディア タイムライン上の特定のポイントにマーカーを関連付けることができます。マーカーは、多くの点で役立つ単なるテキストです。それらを使用して広告を挿入できます。

たとえば、URL をマーカー テキストとして挿入できます。マーカーに到達したら、メディアの再生を一時停止し、別のメディアを再生できます。別のメディアを再生するには、新しい Media を作成する必要があることに注意してください と MediaPlayer オブジェクト。 MediaView を再利用できます .広告ビデオを再生しているときに、MediaView を関連付けます。 新しい MediaPlayer で .広告の再生が終了したら、MediaView をメインの MediaPlayer に関連付けます。 .

Media クラスに getMarkers() が含まれています ObservableMap を返すメソッド。マーカーを追加するには、マップに (キー、値) ペアを追加する必要があります。

次のコード スニペットは、メディアに 3 つのマーカーを追加します:

// Create the Markers
ObservableMap<String, Duration> markers = media.getMarkers();
markers.put("START", Duration.ZERO);
markers.put("INTERVAL", media.getDuration().divide(2.0));
markers.put("END", media.getDuration());

MediaPlayer マーカーに到達したときに MediaMarkerEvent を発生させます。このイベントのハンドラーを onMarker に登録できます。 MediaPlayer のプロパティ .

次のコード スニペットは、MediaMarkerEvent の処理方法を示しています。 . getMarker() イベントのメソッドは、キーと値がそれぞれマーカー テキストとマーカー期間であるペアを返します。

// Add a marker event handler
player.setOnMarker(new EventHandler <MediaMarkerEvent>() 
{
	public void handle(MediaMarkerEvent event) 
	{
		Pair<String, Duration> marker = event.getMarker();
		String markerText = marker.getKey();
		Duration markerTime = marker.getValue();
		messageArea.appendText("\nReached the marker " + markerText + " at " + markerTime);
	}
});

8.2 GUI

次の GUI は MediaPlayer を示しています マーカー付き:

位置マーカーを使用した JavaFX メディアの例

9.メディア メタデータの表示

9.1 コード

FxMediaExample8.java

import java.net.URL;
import javafx.application.Application;
import javafx.collections.ObservableMap;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.effect.DropShadow;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.media.MediaPlayer.Status;
import javafx.scene.media.MediaView;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class FxMediaExample8 extends Application
{
	// Create the Area for Logging
	private TextArea messageArea = new TextArea();
	
	public static void main(String[] args) 
	{
		Application.launch(args);
	}
	
	@Override
	public void start(Stage stage) 
	{
		// Locate the media content in the CLASSPATH
		URL mediaUrl = getClass().getResource("Test.mp3");
		String mediaStringUrl = mediaUrl.toExternalForm();
		
		// Create a Media
		final Media media = new Media(mediaStringUrl);
				
		// Create a Media Player
		final MediaPlayer player = new MediaPlayer(media);
		// Automatically begin the playback
		player.setAutoPlay(false);
		
		// Create a 400X300 MediaView
		final MediaView mediaView = new MediaView(player);
		mediaView.setFitWidth(400);
		mediaView.setFitHeight(300);	
		mediaView.setSmooth(true);
		
		// Create the DropShadow effect
		DropShadow dropshadow = new DropShadow();
		dropshadow.setOffsetY(5.0);
		dropshadow.setOffsetX(5.0);
		dropshadow.setColor(Color.WHITE);

		mediaView.setEffect(dropshadow);		
		
		// Create the Buttons
		Button playButton = new Button("Play");
		Button stopButton = new Button("Stop");
		
		// Create the Event Handlers for the Button
		playButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	if (player.getStatus() == Status.PLAYING) 
            	{
            		player.stop();
            		player.play();
            	} 
            	else 
            	{
            		player.play();
            	}
            }
        });		

		stopButton.setOnAction(new EventHandler <ActionEvent>() 
		{
            public void handle(ActionEvent event) 
            {
            	player.stop();
            }
        });		
				
		// Display the metadata data on the console
		player.setOnReady(new Runnable()
		{
            public void run() 
            {
        		ObservableMap<String, Object> metadata = media.getMetadata();
        		for(String key : metadata.keySet()) 
        		{
        			messageArea.appendText("\n" + key + " = "  + metadata.get(key));
        		}
            }
		});
		
		// Create the HBox
		HBox controlBox = new HBox(5, playButton, stopButton);
		
		// Create the VBox
		VBox root = new VBox(5,mediaView,controlBox,messageArea);
		
		// Set the Style-properties of the HBox
		root.setStyle("-fx-padding: 10;" +
				"-fx-border-style: solid inside;" +
				"-fx-border-width: 2;" +
				"-fx-border-insets: 5;" +
				"-fx-border-radius: 5;" +
				"-fx-border-color: blue;");

		// Create the Scene
		Scene scene = new Scene(root);
		// Add the scene to the Stage
		stage.setScene(scene);
		// Set the title of the Stage
		stage.setTitle("A Metadata Example");
		// Display the Stage
		stage.show();		
	}		
}

一部のメタデータは、メディアを説明するメディアに埋め込まれている場合があります。通常、メタデータには、タイトル、アーティスト名、アルバム名、ジャンル、年などが含まれます。

次のコード スニペットは、MediaPlayer の場合のメディアのメタデータを表示します。 READY を入力します 状態。 Media を作成した直後にメタデータを読み取ろうとしないでください メタデータが利用できない可能性があるためです。

// Display the metadata data on the console
player.setOnReady(new Runnable()
{
	public void run() 
	{
		ObservableMap<String, Object> metadata = media.getMetadata();
		for(String key : metadata.keySet()) 
		{
			messageArea.appendText("\n" + key + " = "  + metadata.get(key));
		}
	}
});

メディアにメタデータがあるかどうか、またはメディアに含まれる可能性のあるメタデータの種類を確認することはできません。アプリケーションでは、タイトル、アーティスト、アルバム、および年を探すだけです。または、すべてのメタデータを読み取り、2 列のテーブルに表示することもできます。メタデータにアーティストの埋め込み画像が含まれている場合があります。
画像を使用するには、マップ内の値のクラス名を確認する必要があります。

9.2 GUI

次の GUI は MediaPlayer を示しています メタデータ付き:

メタデータを含む JavaFX メディアの例

10. Java ソースコードをダウンロード

これは javafx.scene.media の例です オーディオ JavaFX メディア ビデオ

Java タグ