我正在编写一个程序,当给定.wav文件时会绘制波形,但我也希望它也适用于.mp3。由于java.sound软件包不支持.mp3文件,因此我找到了一个github程序,该程序将mp3文件转换为.wav文件。我下载了项目并得到了这个:
现在该项目中有一个我特别感兴趣的类,那就是WaveConverter类。这非常简单,并要求输入.mp3文件和要将其转换为什么的输出。它是这样的:
package org.mp3transform.wav;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.mp3transform.Bitstream;
import org.mp3transform.Decoder;
import org.mp3transform.Header;
public class WavConverter extends Decoder {
public static void main(String[] args) throws Exception {
String in = "test.mp3";
String out = "out.wav";
for (int i = 0; i < args.length; i++) {
if ("-in".equals(args[i])) {
in = args[++i];
} else if ("-in".equals(args[i])) {
out = args[++i];
} else {
System.out.println("Options: -in <input.mp3> -out <output.wav>");
}
}
WavConverter.convert(in, out);
}
private static void convert(String sourceFileName, String destFileName)
throws IOException {
System.out.println(sourceFileName);
InputStream fileIn = new FileInputStream(sourceFileName);
BufferedInputStream in = new BufferedInputStream(fileIn, 128 * 1024);
convert(in, destFileName);
in.close();
}
private static void convert(InputStream sourceStream, String destFileName)
throws IOException {
int frameCount = Integer.MAX_VALUE;
WavConverter decoder = new WavConverter();
Bitstream stream = new Bitstream(sourceStream);
frameCount = Integer.MAX_VALUE;
try {
for (int frame = 0; frame < frameCount; frame++) {
Header header = stream.readFrame();
if (header == null) {
break;
}
if (decoder.channels == 0) {
int channels = (header.mode() == Header.MODE_SINGLE_CHANNEL) ? 1
: 2;
int freq = header.frequency();
decoder.initOutputBuffer(channels, freq, destFileName);
}
decoder.decodeFrame(header, stream);
stream.closeFrame();
}
} finally {
decoder.close();
}
}
private short[] buffer;
private WaveFileWriter outWave;
public void initOutputBuffer(int numberOfChannels, int freq, String fileName)
throws IOException {
super.initOutputBuffer(null, numberOfChannels);
buffer = new short[BUFFER_SIZE];
for (int i = 0; i < numberOfChannels; ++i) {
bufferPointer[i] = (short) i;
}
outWave = new WaveFileWriter(fileName, freq, (short) 16,
(short) numberOfChannels);
}
public void appendSamples(int channel, double[] f) {
int p = bufferPointer[channel];
for (int i = 0; i < 32; i++) {
double sample = f[i];
short s = ((sample > 32767.0f) ? 32767
: ((sample < -32768.0f) ? -32768 : (short) sample));
buffer[p] = s;
p += 2;
}
bufferPointer[channel] = p;
}
public void writeBuffer() throws IOException {
outWave.writeData(buffer, bufferPointer[0]);
for (int i = 0; i < channels; ++i) {
bufferPointer[i] = i;
}
}
public void close() throws IOException {
outWave.close();
}
}
但是,我的问题是我继续获得第50行的FileNotFoundException,这是下面的代码行:
InputStream fileIn =新的FileInputStream(sourceFileName);
由于某种原因,该程序无法找到我的test.mp3文件,尽管从这张照片中可以看出,它显然在同一目录中:
为什么会这样?有没有更好的方法来使用github项目中的类?我真的很困惑,很乐意提供帮助。谢谢。
当您看到类WavConverter实际上只是文件中随后定义的静态方法的实现时,这并不令人感到惊讶。采取所需的方法,将实现留在后面。