java中的AudioInputStream提供了如何从类似颤振/飞镖的音频文件中获取字节数据(必须是有符号的int/bytes)

java中的AudioInputStream提供了如何从类似颤振/飞镖的音频文件中获取字节数据(必须是有符号的int/bytes),java,flutter,dart,Java,Flutter,Dart,你好。我正在尝试在Flatter中创建一个音乐识别应用程序(比如Shazam)(我对Flatter也是新手),我希望它能在手机和桌面上运行 我在Java中有一段代码,它返回一个包含时域值的字节数组: 文件声音文件; 音频输入流音频流; 音频格式;音频格式; 源数据线; 整数检查=0; 字节[]个字节; DataLine.Info; 声音文件=新文件(“./testWave.wav”); songBytes=新字节[(int)soundFile.length()]; audioStream=Aud

你好。我正在尝试在Flatter中创建一个音乐识别应用程序(比如Shazam)(我对Flatter也是新手),我希望它能在手机和桌面上运行

我在Java中有一段代码,它返回一个包含时域值的字节数组:

文件声音文件;
音频输入流音频流;
音频格式;音频格式;
源数据线;
整数检查=0;
字节[]个字节;
DataLine.Info;
声音文件=新文件(“./testWave.wav”);
songBytes=新字节[(int)soundFile.length()];
audioStream=AudioSystem.getAudioInputStream(声音文件);
audioFormat=audioStream.getFormat();
info=新的DataLine.info(SourceDataLine.class,audioFormat);
sourceLine=(SourceDataLine)AudioSystem.getLine(info);
sourceLine.open(音频格式);
sourceLine.start();
while(检查>-1){
check=audioStream.read(songBytes,0,songBytes.length);
}
sourceLine.drain();
sourceLine.close();
for(int i=0;i

我已经搜索过了,但在Flutter/Dart中找不到这样做的方法。如果可能的话,有谁能给我指导一下在颤振/飞镖中执行此操作的最佳方法吗?如果没有,请给我建议执行此操作的最佳方法。(它会根据节数的不同而变化,因此您确实需要对其进行解析以确定其数量。但对于任何一个WAV文件源,它通常都是相同的数字-使用十六进制转储来确定
数据块的偏移量加上4。)

(通过解析标题,您可以了解其他内容,如采样率以及是单声道还是立体声等。)

然后,如果
bytes
Uint8List
,则需要
bytes.buffer.asInt16List(74)
。这意味着:将支持字节的缓冲区解释为有符号短路,但从偏移量74开始-在标头之后

  var dataOffset = 74; // parse the WAV header or determine from a hex dump
  var bytes = await file.readAsBytes();
  var shorts = bytes.buffer.asInt16List(dataOffset);
  print(shorts[0]); // the first sample of audio
  print(shorts.length); // the number of audio samples

据推测,您的WAV是一种正常格式,如单声道、PCM短路或浮动。它将有一个带有块的标题-通常是
fmt
fact
data
。前两个描述格式-采样率、通道数、每个采样位数等,第三个包含该格式的连续字节块(例如little endian 16位短字符)。这比Java要多做一点工作,但实际上您只需要将头去掉并包含
数据
块头,然后将缓冲区的其余部分解释为短路-例如,使用
ByteData.buffer.asInt16List()
感谢您的响应。我理解你的逻辑,我只是不确定如何将ByteData放入缓冲区。我应该使用什么库或函数,因为我想从任何目录中的文件中获取数据。我见过rootBundle.load(AudioAssetFullPath),它从资产中加载它们。它返回我相信需要的数据,但我不相信它可以从任何目录加载数据使用
文件.readAsBytes
从目录中的任意文件读取数据。这将返回一个UINT8列表,不会使我返回负数,或者是这样吗?