【问题标题】:Drawing a graphic waveform from microphone or speakers [closed]从麦克风或扬声器绘制图形波形[关闭]
【发布时间】:2013-11-16 20:55:42
【问题描述】:

所以我一直在研究 java sound api,我可以获取输入、录制和播放声音,我可以使用坐标或 sin 绘制图形。

我希望能够拥有一个现场“示波器”,它从麦克风获取输入并将其转换为随时间滚动的波形,当发出噪音时,声音(频率?)被添加到图表的左侧,然后在不再产生噪音时恢复正常。

如何将字节数组转换为图形?

到目前为止,我有一个可以录制和播放声音的文件(保存在缓冲区而不是文件中),然后将其保存到 .wav 并从 .wav 绘制波形 .png 但这不是实时提要我不知道从这里去哪里。

【问题讨论】:

  • 在从输入读取字节并将其写入输出之间将字节转换为样本。然后将缓冲区绘制到面板上。您不需要库,您可以使用 Swing 绘画和大约 100 行代码来完成此操作,具体取决于您希望它看起来有多好。
  • 你能举一个字节的例子来协调代码吗?我找不到任何工作
  • 这里是one example..
  • 我以前遇到过很多次,它会创建图形的 jpeg 图像而不是实时绘图。但无论如何谢谢
  • 我现在正在开发一个基本上可以满足您要求的程序。这类问题经常被问到,我想我只是写一个来转发。它不是特别短,但它将演示如何基本上完成所有这些事情。

标签: java audio frequency javasound waveform


【解决方案1】:

这是一个(相对较小的)应用程序,它将播放声音并在面板上绘制一个简单的图形:

WaveformDemo on github

它有一些稀疏的 cmets 来指出正在发生的事情,但它通常很简单。真正最好的事情就是看代码。它可以完成您所询问的大部分内容,但无需录制,但代码可以轻松适应。唯一的区别是您将从 TargetDataLine 而不是 AudioInputStream 中提取字节。

窗口函数和量化等一些内容可能需要冗长的解释,但大量文献中都涵盖了这些内容。以我的经验,虽然有很多技术文本,但网络上并没有很多代码示例用于此类事情。 Java Sound Resources 特别是对于 Java 来说是一个非常好的资源,但它有点过时了。所以我希望这能让你开始。

【讨论】:

  • 非常感谢,这正是我想要的,并且在 cmets 中得到了很好的解释。
  • 最后一个问题虽然我一直在玩你的代码并且它运行加载文件并播放它,但我可以使用麦克风创建一个文件然后播放它但是我将如何能够从麦克风获得直接输入并实时显示在图表上吗?我尝试了一个音频输入流,但它不会让我使用它,因为 audioFile 覆盖 getFile 并且我不能例如将其更改为 byte[];而不是文件。
  • 没问题。当您在 TargetDataLine 上调用 read 时,请使用这些字节。除非您从文件中读取,否则您不需要 AudioInputStream。本教程显示了一个循环(在 "Reading the Data from the TargetDataLine" 下),它在结构上与 SwingWorker 播放循环中的循环相同:docs.oracle.com/javase/tutorial/sound/capturing.html 在调用 read 之后发送要转换的字节并显示它们。
  • 所以我已经完全按照你说的做了,here's 我有什么但是我在创建样本时遇到了 1024 的越界异常错误,为什么我认为这是正确的数量一个字节?
  • 您在哪一行得到异常?我看到一些看起来像错误的事情:您调用了两次 out.write 并且您应该调用 windowdrawDisplaycount * 8 / format.getSampleSizeInBits()。 svalid 参数是缓冲区中有效样本的数量,因此有效字节数除以样本中的字节数。我不确定这些问题中的任何一个都会导致超出范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2015-08-24
相关资源
最近更新 更多