JavaFx媒体字节

时间:2018-04-07 18:21:46

标签: javafx byte mp3 media

我想从一个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();

1 个答案:

答案 0 :(得分:1)

JavaFX Media API在Java 10中没有提供太多的低级支持。它似乎只设计了播放媒体所必需的功能,而不是对它进行大量操作。

话虽如此,你可能想看看AudioSpectrumListener。我无法承诺它会给你你想要的东西(我不熟悉计算机音频概念),但它可以让你创造你的声波;至少是粗略的代表。

您使用AudioSpectrumListener MediaPlayer使用相应的property

如果您的计算不必是实时的,那么您可以使用以下方式提前完成:

byte[] bytes = URI.create(media.getSource()).toURL().openStream().readAllBytes();

请注意,如果媒体是远程的,您将最终下载字节两次;一次获取声波的字节,并在实际使用MediaPlayer播放媒体时再次。

此外,您希望在后台线程而不是JavaFX Application线程上执行上述操作,以避免冻结UI。