我不是Java程序员,但是我对渲染音频有些了解,因此希望以下内容会有所帮助…
鉴于您几乎总是拥有比可用像素大得多的样本数量,因此明智的做法是从缓存的样本数据缩减或“摘要”中得出。通常,这就是音频编辑器(例如Audacity)呈现音频数据的方式。实际上,最常见的策略是计算每个像素的样本数量,然后为每个大小的块找到最大和最小样本
SamplesPerPixel,然后在每个最大-
最小对之间绘制一条垂直线。您可能要缓存此缩减,或者针对不同的缩放级别缓存一系列缩减。Audacity缓存到磁盘上的临时文件(“阻止文件”)。
上面的内容可能过于简单化了,因为实际上,您将要根据固定大小的块(例如256个样本)而不是大小之一来计算初始最大-
最小对
SamplesPerPixel。然后,您可以从缓存的减少量中进一步计算“即时”减少量。关键是
SamplesPerPixel通常是动态数量-
因为用户可以随时调整画布的大小(希望的大小…)。
还要记住,在绘制到画布上时,需要按画布的宽度和高度缩放样本值。最好的方法(至少在垂直方向上)是对样本进行归一化,然后乘以画布高度。16位音频由[-32768,32767]范围内的样本组成,因此要进行归一化,只需将浮点数除以32768。然后反转符号(将波形翻转到画布坐标),加1(以补偿为负值),然后乘以画布高度的
一半 。无论如何,我就是这样做的。
该页面显示了如何使用Java Swing构建基本的波形显示。我没有详细研究它,但是我认为它只是对数据进行下采样,而不是计算最大-
最小对。当然,这将无法提供与max-min方法一样精确的减少量,但是更容易计算。
如果您想知道如何正确地做事,则应该深入研究Audacity源代码(但是请注意,它是相当粗糙的C
++)。要获得一般概述,您可以查看Audacity的原始作者Dominic
Mazzoni的“基于磁盘的音频编辑的快速数据结构”。但是,您需要从CMJ购买。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)