java 中 100 毫秒的音频帧。
Audio Framing of 100 ms in java.
我想从音频文件中获取 100 毫秒的音频帧。我使用下面的代码获取帧,但我只在几个起始帧中获取数据。我不太了解 java 中的音频文件处理。请帮助我并指导我。我是对的,或者有些事情是错的。抱歉我的英语不好。
public static void main(String[] args) throws UnsupportedAudioFileException, IOException {
byte[] audioBytes;
File file = new File("3.wav");
AudioInputStream frame;
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
AudioFormat format = fileFormat.getFormat();
long audioFileLength = file.length();
int frameSize = format.getFrameSize();
double frameRate = format.getFrameRate();
int frameDuration = 10;
double frameLength = ( (frameRate * frameSize) / frameDuration );
double numOfFrames = (audioFileLength /frameLength);
long remaining = audioFileLength;
long framesOfAudioToCopy = (long) ( format.getFrameRate() / frameDuration );
System.out.println(framesOfAudioToCopy);
int i = 0;
while(remaining > frameLength )
{
audioInputStream.skip((long) (i * frameLength));
frame = new AudioInputStream(audioInputStream, format, framesOfAudioToCopy );
audioBytes = new byte[frame.available()];
frame.read(audioBytes);
System.out.println(Arrays.toString(audioBytes));
i++;
remaining = (long) (remaining - frameLength);
/* if(remaining < frameLength)
{
i++;
audioInputStream.skip((long) (i * frameLength));
frame = new AudioInputStream(audioInputStream, format, framesOfAudioToCopy );
audioBytes = new byte[frame.available()];
frame.read(audioBytes);
}*/
}
}
我认为您正在做很多不需要的额外工作。这是一个更简单的重写,它可以完成您所描述的(我认为):
int numBytesIn100Millis =
((int) (format.getFrameRate() / 10)) * format.getFrameSize();
byte[] buffer = new byte[numBytesIn100Millis];
for (;;) {
int bytesRead = audioInputStream.read(buffer);
if (bytesRead < 0)
break;
if (bytesRead < buffer.length)
// this just fills the end of 'buffer' with 0s
// if read() didn't fill the entire array
Arrays.fill(buffer, bytesRead, buffer.length, ((byte) 0));
// 'buffer' now has 100ms of audio
}
您遇到的问题可能是由于您如何使用 skip
以及每次阅读时都创建了一个新的 AudioInputStream
:
audioInputStream.skip((long) (i * frameLength));
frame = new AudioInputStream(audioInputStream, format, framesOfAudioToCopy );
从 frame
读取导致 audioInputStream
也得到提升。
无论如何,我看不出这样做的理由。这很复杂,也没有必要。
我想从音频文件中获取 100 毫秒的音频帧。我使用下面的代码获取帧,但我只在几个起始帧中获取数据。我不太了解 java 中的音频文件处理。请帮助我并指导我。我是对的,或者有些事情是错的。抱歉我的英语不好。
public static void main(String[] args) throws UnsupportedAudioFileException, IOException {
byte[] audioBytes;
File file = new File("3.wav");
AudioInputStream frame;
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(file);
AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(file);
AudioFormat format = fileFormat.getFormat();
long audioFileLength = file.length();
int frameSize = format.getFrameSize();
double frameRate = format.getFrameRate();
int frameDuration = 10;
double frameLength = ( (frameRate * frameSize) / frameDuration );
double numOfFrames = (audioFileLength /frameLength);
long remaining = audioFileLength;
long framesOfAudioToCopy = (long) ( format.getFrameRate() / frameDuration );
System.out.println(framesOfAudioToCopy);
int i = 0;
while(remaining > frameLength )
{
audioInputStream.skip((long) (i * frameLength));
frame = new AudioInputStream(audioInputStream, format, framesOfAudioToCopy );
audioBytes = new byte[frame.available()];
frame.read(audioBytes);
System.out.println(Arrays.toString(audioBytes));
i++;
remaining = (long) (remaining - frameLength);
/* if(remaining < frameLength)
{
i++;
audioInputStream.skip((long) (i * frameLength));
frame = new AudioInputStream(audioInputStream, format, framesOfAudioToCopy );
audioBytes = new byte[frame.available()];
frame.read(audioBytes);
}*/
}
}
我认为您正在做很多不需要的额外工作。这是一个更简单的重写,它可以完成您所描述的(我认为):
int numBytesIn100Millis =
((int) (format.getFrameRate() / 10)) * format.getFrameSize();
byte[] buffer = new byte[numBytesIn100Millis];
for (;;) {
int bytesRead = audioInputStream.read(buffer);
if (bytesRead < 0)
break;
if (bytesRead < buffer.length)
// this just fills the end of 'buffer' with 0s
// if read() didn't fill the entire array
Arrays.fill(buffer, bytesRead, buffer.length, ((byte) 0));
// 'buffer' now has 100ms of audio
}
您遇到的问题可能是由于您如何使用 skip
以及每次阅读时都创建了一个新的 AudioInputStream
:
audioInputStream.skip((long) (i * frameLength));
frame = new AudioInputStream(audioInputStream, format, framesOfAudioToCopy );
从 frame
读取导致 audioInputStream
也得到提升。
无论如何,我看不出这样做的理由。这很复杂,也没有必要。