在java中绘制wav文件

Posted

技术标签:

【中文标题】在java中绘制wav文件【英文标题】:Graphing wav file in java 【发布时间】:2014-12-17 02:06:59 【问题描述】:

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

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

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

【问题讨论】:

您需要知道最小值和最大值,这意味着您需要读取整个文件并“标准化”结果 而且没有 “我可以将结果用作要在图中使用的变量吗?” - result 是从流(进入bytes 数组) 另外,什么 GUI 框架工作? Swing/AWT/GWT/html/JavaFX/SWT? 您还需要解析 wav 文件以提取音频样本。 ***.com/questions/8754111/… @MadProgrammer 我怎么知道最小值和最大值?在读取 wav 文件时,我将在图中使用什么作为变量? 【参考方案1】:

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

    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);
 

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

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

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

    

仅供参考:阅读文件时填充此信息会更有效

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

【讨论】:

在我的程序中,我打算将结果保存在一个文本文件中,然后我将使用 gnuplot 绘制它。如何使用 max/min 在 gnuplot 中绘制它?我可以将最大/最小值保存在文本文件中,然后继续我如何绘制它吗? 一旦你有了样本,你可能不需要最小/最大值,因为(我假设)gnuplot 会计算出来,但你需要检查它的要求...... 好吧,我不得不接受这个。这可能会减少我的程序的文件处理,这也是一个很大的帮助。谢谢! int sample = getSixteenBitSample(high, low);此行引发错误,因为该方法不存在。你能帮我解决这个问题吗=) @MikeBrianOlivera 嗯,我想知道那去了哪里……没关系,我已经添加了它

以上是关于在java中绘制wav文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中绘制 Wav 文件视听

Python解析Wav文件并绘制波形的方法

使用python过滤wav文件

WAV 文件的 FFT 和输出以绘制频谱

读取音频 wav 文件并绘制在 python 中平滑的音频频率响应

python绘制wav音频文件波形图