【问题标题】:JavaFx media bytesJavaFx 媒体字节
【发布时间】:2018-04-09 02:29:08
【问题描述】:

我想在我的 java 程序中从一个 mp3 文件创建一个声波。我研究并发现,对于 wav 文件,我需要使用 AudioInputStream 并计算一个字节数组......从 mp3-File 我使用 JavaFX 媒体和媒体播放器。 Inputstream 中的字节与 Javafx media.getSource().getBytes() 中的字节是否相同? ? AudioInputStream 无法读取 mp3...

或者我应该如何获取声波的 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();

【问题讨论】:

    标签: javafx byte mp3 media


    【解决方案1】:

    自 Java 10 起,JavaFX 媒体 API 不提供太多低级支持。它似乎被设计为仅具有播放媒体的必要功能,而不是显着操作它。

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

    您将AudioSpectrumListenerMediaPlayer 使用对应的property


    如果您的计算不必是实时的,那么您可以使用以下方法提前进行计算:

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

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

    此外,您需要在后台线程而不是 JavaFX 应用程序线程上执行上述操作,以避免冻结 UI。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      相关资源
      最近更新 更多