2014年2月11日 星期二

JavaFX Audio Clip

JavaFX內建支援處理音訊與影像的API,分為Audio Clip與Media,前者僅處理播放簡短音訊;後者則類似於Java Media Framework,可播放音訊與影像。

JavaFX支援以下的音訊與影像編碼:
  • AAC:進階音訊編碼 (Advanced Audio Coding)。
  • MP3:MPEG-1、MPEG-2、MPEG-2.5與Layer-1、Layer-2與Layer-3音訊。
  • PCM:非壓縮音訊資料格式。
  • H.264/AVC:H.264、MPEG-4 Part 10、AVC (Advanced Video Coding) 影像。
  • VP6:TrueMotion VP6是由On2 Technologies所推出的影像壓縮編碼器,目前廣泛應用於Adobe Flash影像。
JavaFX支援以下的音訊與影像格式:
  • Audio Interchange File Format (*.aif, *.aiff)
  • Microsoft Windows Waveform Audio (*.wav)
  • MPEG Layer-3 Audio (*.mp3)
  • Flash Video (*.flv)
  • FX Media (*.fxm)
  • MP2T HTTP Live Streaming (*.m3u8)
  • MP3 HTTP Live Streaming (*.m3u8)
  • MPEG-4 Video (*.mp4, *.m4a, *.m4v)
分別由以下類別處理:
  • javafx.scene.media.AudioClip
  • javafx.scene.media.Media
  • javafx.scene.media.MediaPlayer
  • javafx.scene.media.MediaView
以下類別處理音訊等化器 (Audio Equalizer):
  • javafx.scene.media.AudioEqualizer
  • javafx.scene.media.EqualizerBand
以下類別處理媒體事件:
  • javafx.scene.media.MediaErrorEvent
  • javafx.scene.media.MediaMarkerEvent
在JavaFX中欲播放簡短音訊,可使用javafx.scene.media.AudioClip類別,類似於Java AWT的AudioClip介面。

AudioClip類別定義以下的屬性值:
  • balance:音量平衡,範圍由-1.0至1.0,-1.0代表完全左音量、0.0代表左右平衡、1.0代表完全右音量。
  • cycleCount:重覆播放次數,若為AudioClip.INDEFINITE,將一直重覆播放至執行stop()方法為止。
  • pan:音量平移,範圍由-1.0至1.0,-1.0代表完全左聲道、0.0代表正常聲道、1.0代表完全右聲道。
  • priority:音訊的優先順序。
  • rate:播放速率,範圍由0.125至8.0,0.125代表1/8倍播放速率、1.0代表正常播放速率、8.0代表8倍播放速率。
  • volume:音量大小,範圍由0.0至1.0,0.0代表靜音、1.0代表最大音量。
除了AudioClip類別之外,JavaFX並提供AudioClipBuilder類別處理音訊。

AudioClip類別的建構函式如下,其中參數source設定音訊來源,可為URL或本機檔案:

  public AudioClip(String source)

AudioClip類別的方法包括:
  • play()播放音訊。
  • isPlaying()判斷是否正在播放音訊中。
  • stop()停止播放音訊。
  • getBalance()取得音量平衡,範圍由-1.0至1.0,-1.0代表完全左音量、0.0代表左右平衡、1.0代表完全右音量。
  • setBalance():設定音量平衡。
  • getCycleCount()取得重覆播放次數。
  • setCycleCount()設定重覆播放次數,若設定為AudioClip.INDEFINITE,將一直重覆播放至執行stop()方法為止。
  • getPan()取得音量平移,範圍由-1.0至1.0,-1.0代表完全左聲道、0.0代表正常聲道、1.0代表完全右聲道。
  • setPan()設定音量平移。
  • getPriority()取得音訊的優先順序。
  • setPriority()設定音訊的優先順序。
  • getRate()取得播放速率,範圍由0.125至8.0,0.125代表1/8倍播放速率、1.0代表正常播放速率、8.0代表8倍播放速率。
  • setRate()設定播放速率。
  • getVolume()取得音量大小,範圍由0.0至1.0,0.0代表靜音、1.0代表最大音量。
  • setVolume()設定音量大小。
須注意的是上述設定方法,其設定值並不會影響正在播放中的音訊,只有在下一次執行play()方法播放音訊時才會生效。

請參考以下範例,示範以滑動軸與核取方塊設定音量平衡、重覆播放次數、音量平移、播放速率與音量大小。當移動滑動軸時,則以滑動軸目前的值分別設定上述屬性。當點選核取方塊時,則設定重覆播放次數為AudioClip.INDEFINITE,代表無限次數:


CheckBox checkbox;
Slider slider1, slider2, slider3, slider4, slider5;
...

// 設定音量平衡
slider1 = new Slider();
slider1.setOrientation(Orientation.HORIZONTAL);
slider1.setMin(-1.0);
slider1.setMax(1.0);
slider1.setValue(audioclip.getBalance());
slider1.setPrefSize(100, 25);

slider1.valueProperty().addListener(new ChangeListener<Number>() {
  @Override public void changed(
  ObservableValue<? extends Number> observable, 
  Number oldValue, Number newValue) {

    // 設定音量平衡
    audioclip.setBalance(slider1.getValue());  
    lblValue1.setText(new DecimalFormat("0.0").format(
      slider1.getValue()));
  }
});

// 設定重覆播放次數
slider2 = new Slider();
slider2.setOrientation(Orientation.HORIZONTAL);
slider2.setMin(1);
slider2.setMax(10);
slider2.setValue(audioclip.getCycleCount());
slider2.setPrefSize(100, 25);

slider2.valueProperty().addListener(new ChangeListener<Number>() {
  @Override public void changed(
  ObservableValue<? extends Number> observable, 
  Number oldValue, Number newValue) {

    // 設定重覆播放次數
    audioclip.setCycleCount((int)slider2.getValue());  
    lblValue2.setText(new DecimalFormat("0").format(
      slider2.getValue()));
  }
});

checkbox = new CheckBox("Indefinite");
checkbox.selectedProperty().addListener(new ChangeListener<Boolean>() {
  @Override public void changed(
  ObservableValue observable, 
  Boolean oldValue, Boolean newValue) {

    // 設定重覆播放次數
    audioclip.setCycleCount(
      newValue? AudioClip.INDEFINITE : (int)slider2.getValue());  
    slider2.setDisable(newValue);
    lblValue2.setDisable(newValue);
  }
});


須注意的是AudioClip類別的設定方法,其設定值並不會影響正在播放中的音訊,只有在下一次執行play()方法播放音訊時方會生效。

由以上範例可以瞭解,AudioClip類別的主要功能僅在於播放與停止播放音訊,並無法處理暫停播放、音訊時間長度、後設資料、等化器、事件等功能。

【執行結果】
除了AudioClip類別之外,亦可使用AudioClipBuilder類別處理音訊,請參考以下範例。

【程式說明】

範例示範以AudioClipBuilder類別處理音訊,首先以create()方法建立AudioClipBuilder的實體,最後再以build()方法以AudioClipBuilder物件建立AudioClip物件,其間並以上述方法設定音訊的相關屬性,各方法可為任意順序或省略:



AudioClip audioclip = null;

URL source = getClass().getResource("audio/Windows.wav");

audioclip = AudioClipBuilder.create()
  .source(source.toString())
  .balance(0.0)
  .cycleCount(1)
  .pan(0.0)
  .rate(1.0)
  .volume(1.0)
  .build();


【參考資料】

[1] 黃嘉輝,深入研究JavaFX 2。
[2] 黃嘉輝,深入研究Java Swing。
[3] Java Official Web Site:http://www.oracle.com/technetwork/java/index.html
[4] JavaFX:http://www.oracle.com/technetwork/java/javafx
[5] JavaFX 2.2 API Specification.
[6] Java Platform, Standard Edition 7 API Specification.

© Chia-Hui Huang 

沒有留言:

張貼留言