我想从一个mp3文件在我的java程序中创建一个声波。我研究并发现,对于wav文件,我需要使用AudioInputStream并计算一个字节数组......从mp3-File我使用的是JavaFX媒体和媒体播放器。来自Inputstream的字节是否与Javafx media.getSource()中的字节相同.getBytes(); ? AudioInputStream无法读取mp3 ...
或者我如何获得soundwave的mp3文件的值?
来自AudioInputStream的字节:
AudioInputStream audioInputStream;
try {
audioInputStream = AudioSystem.getAudioInputStream(next);
int frameLength = (int) audioInputStream.getFrameLength();
int frameSize = (int) audioInputStream.getFormat().getFrameSize();
byte[] bytes = new byte[frameLength * frameSize];
g2.setColor(Color.MAGENTA);
for(int p = 0; p < bytes.length; p++){
g2.fillRect(20 + (p * 3), 50, 2, bytes[p]);
}
} catch (UnsupportedAudioFileException | IOException e) {
e.printStackTrace();
}
来自JavaFX:
Media media;
MediaPlayer player;
media = new Media("blablafile");
player = new Mediaplayer(media);
byte[] bytes = media.getSource().getBytes();
答案 0 :(得分:1)
JavaFX Media API在Java 10中没有提供太多的低级支持。它似乎只设计了播放媒体所必需的功能,而不是对它进行大量操作。
话虽如此,你可能想看看AudioSpectrumListener
。我无法承诺它会给你你想要的东西(我不熟悉计算机音频概念),但它可以让你创造你的声波;至少是粗略的代表。
您使用AudioSpectrumListener
MediaPlayer
使用相应的property。
如果您的计算不必是实时的,那么您可以使用以下方式提前完成:
byte[] bytes = URI.create(media.getSource()).toURL().openStream().readAllBytes();
请注意,如果媒体是远程的,您将最终下载字节两次;一次获取声波的字节,并在实际使用MediaPlayer
播放媒体时再次。
此外,您希望在后台线程而不是JavaFX Application线程上执行上述操作,以避免冻结UI。