Java 波形代码。。我确实需要帮助…请
你能给我解释一下(用文字)这个代码的作用吗? 多谢各位 我关注的其实是这两个方面: (一) 2) 对于循环,我不明白。。。 32768是多少? 我的字节Java 波形代码。。我确实需要帮助…请,java,Java,你能给我解释一下(用文字)这个代码的作用吗? 多谢各位 我关注的其实是这两个方面: (一) 2) 对于循环,我不明白。。。 32768是多少? 我的字节 int numChannels = format.getChannels(); for (double x = 0; x < w && audioData != null; x++) { int idx = (int) (frames_per_pixel * numChan
int numChannels = format.getChannels();
for (double x = 0; x < w && audioData != null; x++) {
int idx = (int) (frames_per_pixel * numChannels * x);
// se a 8 bit è immediato
if (format.getSampleSizeInBits() == 8) {
my_byte = (byte) audioData[idx];
} else {
my_byte = (byte) (128 * audioData[idx] / 32768);
int numChannels=format.getChannels();
对于(双x=0;x
这是代码。它取自这里:
(类别抽样图)
int frames\u per\u pixel=audioBytes.size()/format.getFrameSize()/w;
字节my_字节=0;
双y_last=0;
int numChannels=format.getChannels();
对于(双x=0;x
不知道这是否有帮助,但是
128 * someInt / 32768
与
someInt << 7 >> 15
someInt>15
你首先应该了解声音文件是如何组织的。但是无论如何
double y_new = (double) (h * (128 - my_byte) / 256);
lines.add(new Line2D.Double(x, y_last, x, y_new));
y_last = y_new;
本例绘制的线的Y位置代表声音文件的样本值。正如您可能知道的,一个样本可以是8/16/32…位。在本例中,它们将所有位值缩放到8(1字节)。ne Y的中心将位于屏幕中间位置(它是有符号的声音文件).h是屏幕的高度,我们希望将其缩放为127是屏幕顶部,而-127是屏幕下部的像素
2) 32768是有符号16位整数的最大值。因此,16位声音文件的最大样本值。myByte:声音文件保存为字节流。因此,如果使用16位样本,则必须创建整数(Java中的16位,32bin)从屏幕上的2个字节。在本例中,它们仅适用于8位样本数据,因此,如果本例读取16位声音文件,则将样本值转换为此行中的8位:
my_byte = (byte) (128 * audioData[idx] / 32768);
因此,我的字节保存帧“idx”的样本值
这行代码是在“窗口”(矩形、坐标系,如您所愿)上绘制字节序列的方法的一部分
(128-my_byte)
将输入的[-128127]
转换为[256,1]
。除以256将此范围转换为[1,1/256]
,并乘以高度h
得到[-128127]
->[~0,h]
以下to行用于从表示上一字节的点到实际点绘制一条线。实际点将成为下一次迭代的上一点
如果样本大小为16位,则执行这行代码。但是我们需要一个8位的值用于绘图。Java中的
int
为32位,我们有一个16位样本,因此上16位为0,下16位存储音频样本值。算法现在将值向左移动7位,然后向右移动15位:
00000000 00000000 11111111 11111111
-> 00000000 01111111 11111111 10000000 // * 128, << 7
-> 00000000 00000000 00000000 11111111 // : 32768, >> 15
00000000000000111111111111
-> 00000000 01111111 11111111 10000000 // * 128, 00000000 00000000 00000000 11111111 // : 32768, >> 15
老实说,我不知道为什么作者不只是除以256一次,结果应该是一样的
但无论如何,结果是一个字节,代表样本的八个最高有效位。顺便说一句,这是非常不准确的,因为如果你有一个非常安静的16位录音,你将在波形面板上看不到任何内容。你能用一个更有意义的标题编辑你的问题吗?谢谢。
my_byte = (byte) (128 * audioData[idx] / 32768);
double y_new = (double) (h * (128 - my_byte) / 256);
h := the height of the drawable area in pixel
my_byte := a byte [-128,127] (a 8 bit sample from an audio file?)
my_byte = (byte) (128 * audioData[idx] / 32768);
00000000 00000000 11111111 11111111
-> 00000000 01111111 11111111 10000000 // * 128, << 7
-> 00000000 00000000 00000000 11111111 // : 32768, >> 15