Java:从音频文件中提取字节
以下两种实现在从音频文件提取数据字节方面有什么不同 该文件是一个.wav文件,我只想提取数据,没有标题或任何其他内容 实施1:Java:从音频文件中提取字节,java,audio,wav,spectrogram,Java,Audio,Wav,Spectrogram,以下两种实现在从音频文件提取数据字节方面有什么不同 该文件是一个.wav文件,我只想提取数据,没有标题或任何其他内容 实施1: public byte[] extractAudioFromFile(String filePath) { try { // Get an input stream on the byte array // containing the data File file = new File(filePath);
public byte[] extractAudioFromFile(String filePath) {
try {
// Get an input stream on the byte array
// containing the data
File file = new File(filePath);
final AudioInputStream audioInputStream = AudioSystem
.getAudioInputStream(file);
byte[] buffer = new byte[4096];
int counter;
while ((counter = audioInputStream.read(buffer, 0, buffer.length)) != -1) {
if (counter > 0) {
byteOut.write(buffer, 0, counter);
}
}
audioInputStream.close();
byteOut.close();
} catch (Exception e) {
System.out.println(e);
System.exit(0);
}// end catch
return ((ByteArrayOutputStream) byteOut).toByteArray();
}
实施2:
public byte[] readAudioFileData(String filePath) throws IOException,
UnsupportedAudioFileException {
final AudioInputStream audioInputStream = AudioSystem
.getAudioInputStream(new File(filePath));
AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, byteOut);
audioInputStream.close();
byteOut.close();
return ((ByteArrayOutputStream) byteOut).toByteArray();
}
每个实现返回不同大小的字节。
第一个返回字节[],长度小于第二个实现
我试图提取数据字节以可视化文件的光谱图
任何解释都将不胜感激
谢谢
Samer第二个impl正在编写全波“文件格式”。第二个缓冲区比第一个缓冲区大吗 [编辑:好奇到可以尝试它-以上是正确的]
package so_6933920;
import java.io.ByteArrayOutputStream;
import java.io.File;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
public class AudioFiles {
public static void main(String[] args) {
String file = "clarinet.wav";
AudioFiles afiles = new AudioFiles();
byte[] data1 = afiles.readAudioFileData(file);
byte[] data2 = afiles.readWAVAudioFileData(file);
System.out.format("data len: %d\n", data1.length);
System.out.format("data len: %d\n", data2.length);
System.out.format("diff len: %d\n", data2.length - data1.length);
}
public byte[] readAudioFileData(final String filePath) {
byte[] data = null;
try {
final ByteArrayOutputStream baout = new ByteArrayOutputStream();
final File file = new File(filePath);
final AudioInputStream audioInputStream = AudioSystem
.getAudioInputStream(file);
byte[] buffer = new byte[4096];
int c;
while ((c = audioInputStream.read(buffer, 0, buffer.length)) != -1) {
baout.write(buffer, 0, c);
}
audioInputStream.close();
baout.close();
data = baout.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
public byte[] readWAVAudioFileData(final String filePath){
byte[] data = null;
try {
final ByteArrayOutputStream baout = new ByteArrayOutputStream();
final AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(filePath));
AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, baout);
audioInputStream.close();
baout.close();
data = baout.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
}
我试过这个
结果:
data len: 489708
data len: 489752
diff len: 44
注意:我对你的代码片段做了一些随意的清理
这个系统是绝对不允许的。
ifcounter>0并不是必需的,因为若read方法的返回值不是-1,则计数器必须大于0。
第二个impl正在编写全波“文件格式”。第二个缓冲区比第一个缓冲区大吗 [编辑:好奇到可以尝试它-以上是正确的]
package so_6933920;
import java.io.ByteArrayOutputStream;
import java.io.File;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
public class AudioFiles {
public static void main(String[] args) {
String file = "clarinet.wav";
AudioFiles afiles = new AudioFiles();
byte[] data1 = afiles.readAudioFileData(file);
byte[] data2 = afiles.readWAVAudioFileData(file);
System.out.format("data len: %d\n", data1.length);
System.out.format("data len: %d\n", data2.length);
System.out.format("diff len: %d\n", data2.length - data1.length);
}
public byte[] readAudioFileData(final String filePath) {
byte[] data = null;
try {
final ByteArrayOutputStream baout = new ByteArrayOutputStream();
final File file = new File(filePath);
final AudioInputStream audioInputStream = AudioSystem
.getAudioInputStream(file);
byte[] buffer = new byte[4096];
int c;
while ((c = audioInputStream.read(buffer, 0, buffer.length)) != -1) {
baout.write(buffer, 0, c);
}
audioInputStream.close();
baout.close();
data = baout.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
public byte[] readWAVAudioFileData(final String filePath){
byte[] data = null;
try {
final ByteArrayOutputStream baout = new ByteArrayOutputStream();
final AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(filePath));
AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, baout);
audioInputStream.close();
baout.close();
data = baout.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return data;
}
}
我试过这个
结果:
data len: 489708
data len: 489752
diff len: 44
注意:我对你的代码片段做了一些随意的清理
这个系统是绝对不允许的。
ifcounter>0并不是必需的,因为若read方法的返回值不是-1,则计数器必须大于0。
Java不是首字母缩略词,不应该用大写字母书写。数据也是如此,Java不是首字母缩略词,不应该用大写字母书写。数据也是如此。你能解释一下为什么不需要ifcounter>0吗?如果计数器实际为零或小于零,这意味着什么?@way如果没有更多的数据可读取,read方法将返回-1。因此,计数器不应为0或更小。我可能应该把我的答案整理一下,就像它在阅读中应该说的那样你能解释一下为什么不需要ifcounter>0吗?如果计数器实际为零或小于零,这意味着什么?@way如果没有更多的数据可读取,read方法将返回-1。因此,计数器不应为0或更小。我可能应该把我的答案整理一下,就像它在阅读中应该说的那样