java - 在java中绘制wav文件

标签 java audio

我一直在寻找这个,但似乎没有人回答我的问题。 我一直在尝试通过以下方式绘制/绘制 wav 文件:

int result = 0;
try {
    result = audioInputStream.read(bytes);
} catch (Exception e) {
    e.printStackTrace();
}

然后使用结果作为图表的变量。我一直在思考首先将结果更改为分贝是否正确。另外,我使用结果作为图表中使用的变量是否正确?或者有什么方法必须用于绘制 wav 文件吗?

最佳答案

您需要做的第一件事是读取文件的样本,这将为您提供波形(声波)的最小/最大范围...

    File file = new File("...");
    AudioInputStream ais = null;
    try {
        ais = AudioSystem.getAudioInputStream(file);
        int frameLength = (int) ais.getFrameLength();
        int frameSize = (int) ais.getFormat().getFrameSize();
        byte[] eightBitByteArray = new byte[frameLength * frameSize];

        int result = ais.read(eightBitByteArray);

        int channels = ais.getFormat().getChannels();
        int[][] samples = new int[channels][frameLength];

        int sampleIndex = 0;
        for (int t = 0; t < eightBitByteArray.length;) {
            for (int channel = 0; channel < channels; channel++) {
                int low = (int) eightBitByteArray[t];
                t++;
                int high = (int) eightBitByteArray[t];
                t++;
                int sample = getSixteenBitSample(high, low);
                samples[channel][sampleIndex] = sample;
            }
            sampleIndex++;
        }

    } catch (Exception exp) {

        exp.printStackTrace();

    } finally {

        try {
            ais.close();
        } catch (Exception e) {
        }

    }

//...

protected int getSixteenBitSample(int high, int low) {
    return (high << 8) + (low & 0x00ff);
} 

然后您需要确定最小/最大值,下一个示例仅检查 channel 0,但您可以使用相同的概念来检查所有可用 channel ...

    int min = 0;
    int max = 0;
    for (int sample : samples[0]) {

        max = Math.max(max, sample);
        min = Math.min(min, sample);

    }

仅供引用:当您读取文件时填充此信息会更有效

一旦有了这个,您就可以对示例进行建模...但这取决于您打算使用的框架...

关于java - 在java中绘制wav文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27517265/

相关文章:

java - SpringBoot RabbitMq解析盒子的json消息auto

java - Java 中的麦克风级别

audio - FFMPEG:我可以将音频设置为仅在晚上播放吗?

java - 多个 Activity 上的 Android 抽屉导航

java - Java中将可变参数扩展为相应的数量和类型

ipad - AudioServicesPlaySystemSound 不适用于 iPad 设备

c# - 内存样本中的Naudio回放会产生声音的延迟和不美观的间隙

ios - xamarin iOS : How to show the audio amplitude of the voice when recording

java - 编译到 Android 设备时出现 React Native 全新构建错误

java - 如何获取 ResultSet 的整数值并将其分配给 int 变量?