在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文件的主要内容,如果未能解决你的问题,请参考以下文章