java中mp3到wav的转换
我将mp3转换为wav的代码是:java中mp3到wav的转换,java,audio,mp3,wav,javasound,Java,Audio,Mp3,Wav,Javasound,我将mp3转换为wav的代码是: package audio1; import java.io.File; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; public class NewClass {
package audio1;
import java.io.File;
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
public class NewClass {
public static void main(String [] args){
try{
AudioFileFormat inputFileFormat = AudioSystem.getAudioFileFormat(new File("c:\\1.mp3"));
AudioInputStream ais = AudioSystem.getAudioInputStream(new File("c:\\1.mp3"));
AudioFormat audioFormat = ais.getFormat();
System.out.println("File Format Type: "+inputFileFormat.getType());
System.out.println("File Format String: "+inputFileFormat.toString());
System.out.println("File lenght: "+inputFileFormat.getByteLength());
System.out.println("Frame length: "+inputFileFormat.getFrameLength());
System.out.println("Channels: "+audioFormat.getChannels());
System.out.println("Encoding: "+audioFormat.getEncoding());
System.out.println("Frame Rate: "+audioFormat.getFrameRate());
System.out.println("Frame Size: "+audioFormat.getFrameSize());
System.out.println("Sample Rate: "+audioFormat.getSampleRate());
System.out.println("Sample size (bits): "+audioFormat.getSampleSizeInBits());
System.out.println("Big endian: "+audioFormat.isBigEndian());
System.out.println("Audio Format String: "+audioFormat.toString());
AudioInputStream encodedASI = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED, ais);
try{
int i = AudioSystem.write(encodedASI, AudioFileFormat.Type.WAVE, new File("c:\\converted.wav"));
System.out.println("Bytes Written: "+i);
}catch(Exception e){
e.printStackTrace();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
但我得到了以下结果:
File Format Type: MP3
File Format String: MP3 (.mp3) file, byte length: 9631340, data format: MPEG1L3 48000.0 Hz, unknown bits per sample, stereo, unknown frame size, 41.666668 frames/second, , frame length: 10030
File lenght: 9631340
Frame length: 10030
Channels: 2
Encoding: MPEG1L3
Frame Rate: 41.666668
Frame Size: -1
Sample Rate: 48000.0
Sample size (bits): -1
Big endian: true
Audio Format String: MPEG1L3 48000.0 Hz, unknown bits per sample, stereo, unknown frame size, 41.666668 frames/second,
java.lang.ArrayIndexOutOfBoundsException: 1
at org.tritonus.sampled.convert.javalayer.MpegFormatConversionProvider$DecodedMpegAudioInputStream$DMAISObuffer.append(MpegFormatConversionProvider.java:386)
at javazoom.jl.decoder.Obuffer.appendSamples(Unknown Source)
at javazoom.jl.decoder.SynthesisFilter.compute_pcm_samples(Unknown Source)
at javazoom.jl.decoder.SynthesisFilter.calculate_pcm_samples(Unknown Source)
at javazoom.jl.decoder.LayerIIIDecoder.decode(Unknown Source)
at javazoom.jl.decoder.LayerIIIDecoder.decodeFrame(Unknown Source)
at javazoom.jl.decoder.Decoder.decodeFrame(Unknown Source)
at org.tritonus.sampled.convert.javalayer.MpegFormatConversionProvider$DecodedMpegAudioInputStream.execute(MpegFormatConversionProvider.java:307)
at org.tritonus.share.TCircularBuffer.read(TCircularBuffer.java:138)
at org.tritonus.share.sampled.convert.TAsynchronousFilteredAudioInputStream.read(TAsynchronousFilteredAudioInputStream.java:194)
at javax.sound.sampled.AudioInputStream.read(AudioInputStream.java:292)
at com.sun.media.sound.PCMtoPCMCodec$PCMtoPCMCodecStream.read(PCMtoPCMCodec.java:506)
at com.sun.media.sound.SunFileWriter$NoCloseInputStream.read(SunFileWriter.java:199)
at java.io.SequenceInputStream.read(SequenceInputStream.java:208)
at java.io.SequenceInputStream.read(SequenceInputStream.java:211)
at java.io.InputStream.read(InputStream.java:101)
at com.sun.media.sound.WaveFileWriter.writeWaveFile(WaveFileWriter.java:247)
at com.sun.media.sound.WaveFileWriter.write(WaveFileWriter.java:145)
at javax.sound.sampled.AudioSystem.write(AudioSystem.java:1354)
at audio1.NewClass.main(NewClass.java:33)
谁能帮我一下我做错了什么
public static byte [] getAudioDataBytes(byte [] sourceBytes, AudioFormat audioFormat) throws UnsupportedAudioFileException, IllegalArgumentException, Exception{
if(sourceBytes == null || sourceBytes.length == 0 || audioFormat == null){
throw new IllegalArgumentException("Illegal Argument passed to this method");
}
ByteArrayInputStream bais = null;
ByteArrayOutputStream baos = null;
AudioInputStream sourceAIS = null;
AudioInputStream convert1AIS = null;
AudioInputStream convert2AIS = null;
try{
bais = new ByteArrayInputStream(sourceBytes);
sourceAIS = AudioSystem.getAudioInputStream(bais);
AudioFormat sourceFormat = sourceAIS.getFormat();
AudioFormat convertFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate(), 16, sourceFormat.getChannels(), sourceFormat.getChannels()*2, sourceFormat.getSampleRate(), false);
convert1AIS = AudioSystem.getAudioInputStream(convertFormat, sourceAIS);
convert2AIS = AudioSystem.getAudioInputStream(audioFormat, convert1AIS);
baos = new ByteArrayOutputStream();
byte [] buffer = new byte[8192];
while(true){
int readCount = convert2AIS.read(buffer, 0, buffer.length);
if(readCount == -1){
break;
}
baos.write(buffer, 0, readCount);
}
return baos.toByteArray();
} catch(UnsupportedAudioFileException uafe){
//uafe.printStackTrace();
throw uafe;
} catch(IOException ioe){
//ioe.printStackTrace();
throw ioe;
} catch(IllegalArgumentException iae){
//iae.printStackTrace();
throw iae;
} catch (Exception e) {
//e.printStackTrace();
throw e;
}finally{
if(baos != null){
try{
baos.close();
}catch(Exception e){
}
}
if(convert2AIS != null){
try{
convert2AIS.close();
}catch(Exception e){
}
}
if(convert1AIS != null){
try{
convert1AIS.close();
}catch(Exception e){
}
}
if(sourceAIS != null){
try{
sourceAIS.close();
}catch(Exception e){
}
}
if(bais != null){
try{
bais.close();
}catch(Exception e){
}
}
}
}
这里sourceBytes表示MP3文件或WAV文件。audioFormat是要转换的PCM格式。我们还需要将javazoom.com中的mp3spi.jar、tritonus_mp3.jar、jl*.jar、tritonus_share.jar放入类路径中。希望这能对其他人有所帮助
Java 7版本:
public static byte [] getAudioDataBytes(byte [] sourceBytes, AudioFormat audioFormat) throws UnsupportedAudioFileException, IllegalArgumentException, Exception {
if(sourceBytes == null || sourceBytes.length == 0 || audioFormat == null){
throw new IllegalArgumentException("Illegal Argument passed to this method");
}
try (final ByteArrayInputStream bais = new ByteArrayInputStream(sourceBytes);
final AudioInputStream sourceAIS = AudioSystem.getAudioInputStream(bais)) {
AudioFormat sourceFormat = sourceAIS.getFormat();
AudioFormat convertFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, sourceFormat.getSampleRate(), 16, sourceFormat.getChannels(), sourceFormat.getChannels()*2, sourceFormat.getSampleRate(), false);
try (final AudioInputStream convert1AIS = AudioSystem.getAudioInputStream(convertFormat, sourceAIS);
final AudioInputStream convert2AIS = AudioSystem.getAudioInputStream(audioFormat, convert1AIS);
final ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
byte [] buffer = new byte[8192];
while(true){
int readCount = convert2AIS.read(buffer, 0, buffer.length);
if(readCount == -1){
break;
}
baos.write(buffer, 0, readCount);
}
return baos.toByteArray();
}
}
}
马文:
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>mp3spi</artifactId>
<version>1.9.5-1</version>
</dependency>
<dependency>
<groupId>com.googlecode.soundlibs</groupId>
<artifactId>jlayer</artifactId>
<version>1.0.1-1</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
com.googlecode.soundlibs
mp3spi
1.9.5-1
com.googlecode.soundlibs
杰莱尔
1.0.1-1
朱尼特
朱尼特
现有java转换器,其源代码为[this]()。也许你应该从中复制粘贴源文件?我认为真正的问题是源文件。试试我的MP3。你的MP3能有可变比特率吗?也许媒体解码代码并没有那么先进——这是一个非常好的例子,说明了如何使用资源进行出色的尝试:P.用try(//实例化Closeables;…;){}catch(例如……{})替换整个结束部分。代码很漂亮。我不知道我是否理解这个代码。我们如何指定返回的字节数组将是wav格式的数据?我已经尝试了Java7代码,它在'final AudioInputStream convert2AIS=AudioSystem.getAudioInputStream(audioFormat,convert1AIS);'我正在从函数外部传递目标convertFormat,因为“new AudioFormat(Encoding.PCM_SIGNED,16000,16,1,2,16000,true)”给出了相同的错误“java.lang.IllegalArgumentException:不支持的转换:MPEG1L3 44100.0 Hz,每个采样未知位,单声道,未知帧大小,38.28125帧/秒,来自PCM_SIGNED 16000.0 Hz,16位,单声道,2字节/帧,大端字节,这里有一个mp3,可以使用mp3spi主页上的演示代码播放: