如何在JavaFX中创建音频波?

时间:2016-11-25 14:08:12

标签: java javafx

我想在JavaFX中使用Chart Area获取音频波形图。不幸的是,我不清楚怎么做,从声音中提取的值分配给x轴和y轴是什么? 我试着阅读其他帖子,但我在javafx上找不到任何内容。 你能帮帮我吗?

示例图片:

enter image description here

以下是提取波形的代码。

我正在为我的范围提取正确的参数?

如何使用它来使用JavaFX打印图形?

public class SimpleWaveformExtractor implements WaveformExtractor {

    private static final int DEFAULT_BUFFER_SIZE = 32768;

    @Override
    public double[] extract(File inputFile) {
        AudioInputStream in = null;
        try {
            in = AudioSystem.getAudioInputStream(inputFile);
        } catch (Exception e) {
            System.out.println("Cannot read audio file");
            return new double[0];
        }
        AudioFormat format = in.getFormat();
        byte[] audioBytes = readBytes(in);

        int[] result = null;
        if (format.getSampleSizeInBits() == 16) {
            int samplesLength = audioBytes.length / 2;
            result = new int[samplesLength];
            if (format.isBigEndian()) {
                for (int i = 0; i < samplesLength; ++i) {
                    byte MSB = audioBytes[i * 2];
                    byte LSB = audioBytes[i * 2 + 1];
                    result[i] = MSB << 8 | (255 & LSB);
                }
            } else {
                for (int i = 0; i < samplesLength; i += 2) {
                    byte LSB = audioBytes[i * 2];
                    byte MSB = audioBytes[i * 2 + 1];
                    result[i / 2] = MSB << 8 | (255 & LSB);
                }
            }
        } else {
            int samplesLength = audioBytes.length;
            result = new int[samplesLength];
            if (format.getEncoding().toString().startsWith("PCM_SIGN")) {
                for (int i = 0; i < samplesLength; ++i) {
                    result[i] = audioBytes[i];
                }
            } else {
                for (int i = 0; i < samplesLength; ++i) {
                    result[i] = audioBytes[i] - 128;
                }
            }
        }

        return ArraysHelper.normalize(result);
    }

    private byte[] readBytes(AudioInputStream in) {
        byte[] result = new byte[0];
        byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];

        try {
            int bytesRead = 0;
            do {
                bytesRead = in.read(buffer);
                result = ArrayUtils.addAll(result, buffer);
            } while (bytesRead != -1);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

这是界面:

public interface WaveformExtractor {

    double[] extract(File in);
}

这是返回double数组的代码:

 private double[] extractWaveform(File file) throws IOException, UnsupportedAudioFileException {
     return new WavFileExtractor().extract(file);
}

0 个答案:

没有答案