我尝试使用javax.sound library.
更改wav文件的采样率在实施我希望的方法后,我尝试了它,它工作了!
但是创建的.wav
文件只有几个字节大。确切地说它是从最初的~50 MB只有2.090字节
问题是,Java无法从我打开的AudioInputStream读取单个字节。
仅供参考,使用过的文件是使用JLayer转换mp3文件的产品。它工作正常,JLayer没有问题,但我想如果我发布我的整个源代码会更好。注意:我使用了许多System.out.printlns进行日志记录。
所以一开始我导入了所有需要的库,你可以看到我也导入了JLayer。
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import javax.sound.sampled.*;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.JOptionPane;
import javazoom.jl.converter.Converter;
import javazoom.jl.decoder.JavaLayerException;
public class MyConverter {
private static AudioInputStream lowResAis = null;
private static AudioInputStream audioInputStream = null;
设置完这些全局常量后,我正在编写我的主要部分,并预先选择了一个演示文件用于测试目的。
public static void main(String[] args) {
MyConverter converterdemo = new MyConverter();
String wavfilepath = "C:\\Users\\JohnDoe\\Desktop\\Second Nature.wav";
File f = new File(wavfilepath);
converterdemo.convertMp3toWav("C:\\Users\\JohnDoe\\Desktop\\Second Nature.mp3", "C:\\Users\\JohnDoe\\Desktop\\Second Nature.wav");
converterdemo.compressWavFile(wavfilepath);
converterdemo.writeToSoundFile(f);
System.out.println("Everything worked!");
}
这是我的转换方法
public void convertMp3toWav(String sourcefilename, String targetfilename){
Converter con = new Converter();
try {
con.convert(sourcefilename, targetfilename);
System.out.println("Wav File converted!");
} catch (JavaLayerException e) {
this.showOptionPane("Could not convert by using JLayer!");
}
}
转换方法很好(相信我的音频文件没有问题),但这是方法,我担心一点点
添加此行后:System.out.println(AudioSystem.getAudioFileFormat(audioInputStream).getByteLength());
我收到以下错误:java.io.IOException: cannot read a single byte if frame size > 1
我无法从自己的Stream中读取。
public void compressWavFile(String sourcefilename){
try {
InputStream musicfile = new BufferedInputStream(new FileInputStream(sourcefilename));
audioInputStream = AudioSystem.getAudioInputStream(musicfile);
AudioFormat format = audioInputStream.getFormat();
AudioFormat outDataFormat = new AudioFormat((float) 22000.0,
(int) 16, (int) 1, true, false);
if(AudioSystem.isConversionSupported(outDataFormat, format)){
System.out.println("Conversion Supported!");
lowResAis = AudioSystem.getAudioInputStream(outDataFormat, audioInputStream);
}
System.out.println("low res created!");
} catch (UnsupportedAudioFileException e) {
this.showOptionPane("Audio File not Supported!"); e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我故意没有使用try with resource,因为一些巫术,新创建的AudioInputStream
在关闭原始audioInputStream
后也会关闭,而public void writeToSoundFile(File out){
if(AudioSystem.isFileTypeSupported( AudioFileFormat.Type.WAVE, lowResAis)){
try {
AudioSystem.write(lowResAis, AudioFileFormat.Type.WAVE, out);
System.out.println("New wav file written!");
} catch (IOException e) {
e.printStackTrace();
this.showOptionPane("Could not write to new Audio File!");
}
}
try {
System.out.println("closing stream!");
lowResAis.close();
audioInputStream.close();
} catch (IOException e) {
this.showOptionPane("Could not close Audio Stream!");
e.printStackTrace();
}
}
现在是一个静态变量。
AudioInputStream
最后一位仅用于将新创建的File
写入给定的thread safe
。我也不认为这里可能出现任何问题。
我真的认为我的AudioInputStreams存在问题,因为这是唯一可能出错的地方。
编辑:
我添加了一个新的“showOptionPane”方法,以便始终保持private void showOptionPane(String msg){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
JOptionPane.showMessageDialog(null, msg, "Error",
JOptionPane.ERROR_MESSAGE);
}
});
}
。
MyType *var[size];