java - 为什么JavaFX不支持.wav格式?

标签 java swing format javafx wav

1) JavaFX 支持 .wav 格式吗? (从Oracle's page页面不清楚)

2)如果不是,为什么会这样?

Swing 是 AWT 的替代品,JavaFX 也是 Swing 的替代品 我们说它很容易玩.wav Java中的文件格式,那为什么MediaMediaPlayer JavaFX 类不支持.wav格式?有什么问题吗?

更新

当我尝试播放 .wav 文件时出现错误

更新2:

SSCCE:

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import javafx.application.Platform;
import javafx.beans.value.*;
import javafx.embed.swing.JFXPanel;
import javafx.event.*;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.media.*;
import javafx.util.Duration;
import javax.swing.*;

 /** Example of playing all mp3 audio files in a given directory 
 * using a JavaFX MediaView launched from Swing 
 */
public class NewFXMain {
private static void initAndShowGUI() {
// This method is invoked on Swing thread
JFrame frame = new JFrame("FX");
final JFXPanel fxPanel = new JFXPanel();
frame.add(fxPanel);
frame.setBounds(200, 100, 800, 250);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setVisible(true);

Platform.runLater(new Runnable() {
  @Override public void run() {
    initFX(fxPanel);        
  }
 });
 }

 private static void initFX(JFXPanel fxPanel) {
// This method is invoked on JavaFX thread
Scene scene = new SceneGenerator().createScene();
fxPanel.setScene(scene);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
  @Override public void run() {
    initAndShowGUI();
  }
 });
 }
 }

 class SceneGenerator {    
 final Label currentlyPlaying = new Label();
 final ProgressBar progress = new ProgressBar();
 private ChangeListener<Duration> progressChangeListener;

 public Scene createScene() {
final StackPane layout = new StackPane();

 // determine the source directory for the playlist
final File dir = new File("e:\\");
if (!dir.exists() || !dir.isDirectory()) {
  System.out.println("Cannot find video source directory: " + dir);
  Platform.exit();
  return null;
}

// create some media players.
final List<MediaPlayer> players = new ArrayList<MediaPlayer>();
for (String file : dir.list(new FilenameFilter() {
  @Override public boolean accept(File dir, String name) {
    return name.endsWith(".wav");
  }
})) players.add(createPlayer("file:///" + (dir + "\\" + file).replace("\\", "/").replaceAll(" ", "%20")));
 if (players.isEmpty()) {
  System.out.println("No audio found in " + dir);
  Platform.exit();
  return null;
}    

// create a view to show the mediaplayers.
final MediaView mediaView = new MediaView(players.get(0));
final Button skip = new Button("Skip");
final Button play = new Button("Pause");

// play each audio file in turn.
for (int i = 0; i < players.size(); i++) {
  final MediaPlayer player     = players.get(i);
  final MediaPlayer nextPlayer = players.get((i + 1) % players.size());
  player.setOnEndOfMedia(new Runnable() {
    @Override public void run() {
      player.currentTimeProperty().removeListener(progressChangeListener);
      mediaView.setMediaPlayer(nextPlayer);
      nextPlayer.play();
    }
  });
  }

// allow the user to skip a track.
skip.setOnAction(new EventHandler<ActionEvent>() {
  @Override public void handle(ActionEvent actionEvent) {
    final MediaPlayer curPlayer = mediaView.getMediaPlayer();
    MediaPlayer nextPlayer = players.get((players.indexOf(curPlayer) + 1) %       players.size());
    mediaView.setMediaPlayer(nextPlayer);
    curPlayer.currentTimeProperty().removeListener(progressChangeListener);
    curPlayer.stop();
    nextPlayer.play();
  }
   });

 // allow the user to play or pause a track.
 play.setOnAction(new EventHandler<ActionEvent>() {
  @Override public void handle(ActionEvent actionEvent) {
    if ("Pause".equals(play.getText())) {
      mediaView.getMediaPlayer().pause();
      play.setText("Play");
    } else {
      mediaView.getMediaPlayer().play();
      play.setText("Pause");
    }
  }
 });

 // display the name of the currently playing track.
 mediaView.mediaPlayerProperty().addListener(new ChangeListener<MediaPlayer>() {
  @Override public void changed(ObservableValue<? extends MediaPlayer> observableValue, MediaPlayer oldPlayer, MediaPlayer newPlayer) {
    setCurrentlyPlaying(newPlayer);
  }
 });

 // start playing the first track.
 mediaView.setMediaPlayer(players.get(0));
 mediaView.getMediaPlayer().play();
 setCurrentlyPlaying(mediaView.getMediaPlayer());


 Button invisiblePause = new Button("Pause");
 invisiblePause.setVisible(false);
 play.prefHeightProperty().bind(invisiblePause.heightProperty());
 play.prefWidthProperty().bind(invisiblePause.widthProperty());

 // layout the scene.
 layout.setStyle("-fx-background-color: cornsilk; -fx-font-size: 20; -fx-padding: 20; -fx-alignment: center;");
 layout.getChildren().addAll(
  invisiblePause,
  VBoxBuilder.create().spacing(10).alignment(Pos.CENTER).children(
    currentlyPlaying,
    mediaView,
    HBoxBuilder.create().spacing(10).alignment(Pos.CENTER).children(skip, play, progress).build()
  ).build()
  );
 progress.setMaxWidth(Double.MAX_VALUE);
 HBox.setHgrow(progress, Priority.ALWAYS);
 return new Scene(layout, 800, 600);
 }


 private void setCurrentlyPlaying(final MediaPlayer newPlayer) {
 progress.setProgress(0);
 progressChangeListener = new ChangeListener<Duration>() {
  @Override public void changed(ObservableValue<? extends Duration> observableValue, Duration oldValue, Duration newValue) {
    progress.setProgress(1.0 * newPlayer.getCurrentTime().toMillis() / newPlayer.getTotalDuration().toMillis());
  }
  };
 newPlayer.currentTimeProperty().addListener(progressChangeListener);

 String source = newPlayer.getMedia().getSource();
 source = source.substring(0, source.length() - ".mp4".length());
 source = source.substring(source.lastIndexOf("/") + 1).replaceAll("%20", " ");
 currentlyPlaying.setText("Now Playing: " + source);
 }

  /** @return a MediaPlayer for the given source which will report any errors it    encounters */
 private MediaPlayer createPlayer(String aMediaSrc) {
 System.out.println("Creating player for: " + aMediaSrc);
 final MediaPlayer player = new MediaPlayer(new Media(aMediaSrc));
 player.setOnError(new Runnable() {
  @Override public void run() {
    System.out.println("Media error occurred: " + player.getError());
  }
 });
return player;
}
}

异常(exception):

     Exception in runnable
     MediaException: MEDIA_UNSUPPORTED : Compressed WAVE is not supported!
at javafx.scene.media.Media.<init>(Unknown Source)
at SceneGenerator.createPlayer(NewFXMain.java:176)
at SceneGenerator.createScene(NewFXMain.java:74)
at NewFXMain.initFX(NewFXMain.java:39)
at NewFXMain.access$000(NewFXMain.java:20)
at NewFXMain$1.run(NewFXMain.java:32)
at com.sun.javafx.application.PlatformImpl$3.run(Unknown Source)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(Unknown Source)
at com.sun.glass.ui.win.WinApplication$2$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:722)

最佳答案

对我来说这似乎很清楚 - Supported Media Types

...
MP4 MPEG-4 Part 14  H.264/AVC   AAC video/mp4, audio/x-m4a, video/x-m4v .mp4, .m4a, .m4v
WAV Waveform Audio Format   N/A PCM audio/x-wav .wav

编辑: 因此,显而易见的答案(根据您的编辑)是 JavaFX 不支持压缩波形格式。

WAV: Most WAV files are uncompressed, but they can hold compressed audio as well. JavaFX has no support for playing the compressed form yet. So when incorporating WAV files, developers need to make sure that the file format is WAV containing uncompressed PCM.

source

关于java - 为什么JavaFX不支持.wav格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14284672/

相关文章:

java - ComponentView 在顶部有不必要的额外插入

java - 强制其他手机识别 Android 蓝牙设备名称中的更新

java - Node.js 解密不适用于其他密码的密文

java - 附加到 JTextPane 的多个问题

java - 将秒转换为人类可读格式 MM :SS Java

vba - 使用access vba检查Windows日期格式

java - java-如何仅将数据或对象保留在高速缓存或集合中30秒钟

java - JComboBox 中的项目居中,并且在禁用时清晰地显示文本

java - 将 JScrollPane 组件添加到 JTable 列

python - 如何制作自定义打印格式?