Java,Matlab读取Wav文件中的数据,它有什么不同?

Java,Matlab读取Wav文件中的数据,它有什么不同?,java,matlab,audio,endianness,Java,Matlab,Audio,Endianness,在Matlab中,这看起来非常简单,但一旦我尝试使用java读取Wav文件,与Matalb相比,我得到了错误的数据 我从Wav文件的44字节地址知道,这是实际数据 用Matlab我只需要输入这个 [nData] = wavread("DoorBell.wav",'native') 我说有133000个样本 这是样本号3000~3015中的一部分: 6743 5754 4200 2396 654 -1253 -3141 -4393 -5063 -5062 -4139 -2891 -1588 -1

在Matlab中,这看起来非常简单,但一旦我尝试使用java读取Wav文件,与Matalb相比,我得到了错误的数据

我从Wav文件的44字节地址知道,这是实际数据

用Matlab我只需要输入这个

[nData] = wavread("DoorBell.wav",'native')
我说有133000个样本 这是样本号3000~3015中的一部分:

6743 5754 4200 2396 654 -1253 -3141 -4393 -5063 -5062 -4139 -2891 -1588 -193 482 
因为有两个通道,所以第二个通道在matlab中也会以相同的值出现

但有一次我尝试使用Java代码来读取数据,我知道WAV将数据保存为小的endian字节

通过这段代码,我决定需要读取多少字节,然后将其读入byte[]数组,并使用shortBuffer和byteBuffer使其与int16示例类似

dataBuffer = new byte[getDataBytes(subChunk2Size)];

        //get the actual data
        randAccess.seek(44);
        randAccess.read(dataBuffer);
        System.out.println(dataBuffer.length);

private static short[] bytesToShort(byte[] bytes) 
{
     short[] tempArr = new short[bytes.length/2];
     ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN).asShortBuffer().get(tempArr);
     return tempArr;
}
short[] samples = bytesToShort(dataBuffer);

for (int i = 0; i < samples.length; i++) {
            out.println(samples[i]);
        }
dataBuffer=新字节[getDataBytes(subChunk2Size)];
//获取实际数据
randAccess.seek(44);
randAccess.read(dataBuffer);
System.out.println(数据缓冲区长度);
私有静态short[]bytesToShort(字节[]字节)
{
short[]tempArr=新的short[bytes.length/2];
ByteBuffer.wrap(字节).order(ByteOrder.BIG_ENDIAN).asShortBuffer().get(tempArr);
返回节拍;
}
short[]samples=bytesToShort(dataBuffer);
对于(int i=0;i
这里是从3000到3015的样本,“注意,我没有拿第一个样本作为例子,因为它是零

2229831254 2664023561-291827163-17421-102581482815084-10769-18956-1306316383-7679

我花了很多时间想弄清楚那是什么?
我不知道!

WAV格式通常是每个样本16位-这些详细信息在标题值中,您显然没有解析这些值!因此单个16位样本以两个字节的形式存储在文件中-因此需要获得正确的endianness。我首先定义一个常量,比如浮点0.6,然后将其转换为您使用两种语言的r 16位单整数。再次将其转换回浮点以确保获得原始的0.6浮点。掌握后,这方面的练习将非常有启发性。

如果您知道WAV以小尾端格式保存数据,为什么要在代码中使用
大尾端
?6743十六进制是0x1a57.22298英寸hex是0x571a.hmmmm…@LukeWoodward你是对的,这似乎是我的错,我以为使用BIG_ENDIAN会将小的转换为大的,谢谢,我做到了!但这里还有一个问题,不,我有一个包含所有样本的数组,尝试将其写入文件,但在文件中我没有所有样本,甚至我正在循环数组以打印所有样本file@Ahmed阿德尔:如果你还有其他问题要问,请另外问一个问题。我问了,我知道我每个样本的特定文件位是int16,我开始从数据开始的地址44字节读取实际数据