我可以显示波形,但我不知道如何放大波形。
任何的想法?
谢谢短笛
最佳答案
通过缩放,我认为您的意思是水平缩放而不是垂直缩放。音频编辑器这样做的方式是扫描波形,将其分解为时间窗口,其中 X 中的每个像素代表一定数量的样本。它可以是一个小数,但您可以不使用小数缩放比例,而不会过多地惹恼用户。缩小一点后,最大值始终为正整数,最小值始终为负整数。
对于屏幕上的每个像素,您需要知道该像素的最小采样值和最大采样值。因此,您需要一个函数来扫描 block 中的波形数据并跟踪该 block 的累积最大值和最小值。
这是一个缓慢的过程,因此专业的音频编辑器会以某个固定的缩放比例保留预先计算的最小值和最大值表。它可能位于 512/1 或 1024/1。当您以 > 1024 个样本/像素的缩放比率进行绘图时,您将使用预先计算的表格。如果您低于该比率,您将直接从文件中获取数据。如果你不这样做,你会发现当你缩小时你绘制代码变得太慢了。
做这个扫描的时候写一次处理文件所有 channel 的代码是值得的,这里的慢会让你的整个程序感觉迟钝,这里重要的是磁盘IO,CPU跟上没有问题,所以简单的 C++ 代码可以很好地构建最小/最大表,但是您不想多次浏览文件并且希望按顺序执行。
一旦你有了最小/最大表,就把它们放在身边。您希望尽可能少地返回磁盘,并且想要重新绘制窗口的许多原因不需要您重新扫描最小/最大表。与最初构建它们的磁盘 io 成本相比,保留它们的内存成本并不高。
然后,通过在该像素表示的时间的最大值和最小值之间绘制一系列 1 像素宽的垂直线来绘制波形。如果您从预先构建的最小/最大表中绘图,这应该会非常快。
回答者 https://stackoverflow.com/users/234815/John%20Knoeller
关于java - 显示音频波形和缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4594737/