java mp3转wav,MP3在Java WAV转换

这篇博客讨论了在Java中将MP3文件转换为WAV格式时遇到的问题,主要是一个ArrayIndexOutOfBoundsException异常。作者提供了错误的代码示例,并分享了一个修复此问题的函数,该函数通过多次转换来处理音频数据。解决方案包括添加必要的库到类路径,并使用PCM_SIGNED编码进行转换。
摘要由CSDN通过智能技术生成

My code to convert mp3 to wav is:

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();

}

}

}

But I am getting following output:

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)

Can anyone help me what I am doing wrong?

解决方案

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){

}

}

}

}

Here sourceBytes represents MP3 file or WAV file. audioFormat is PCM format in which you want conversion. Also we need to put mp3spi.jar, tritonus_mp3.jar, jl*.jar, tritonus_share.jar from javazoom.com in classpath. Hope this may help to other.

Java 7 version:

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();

}

}

}

Maven:

com.googlecode.soundlibs

mp3spi

1.9.5-1

com.googlecode.soundlibs

jlayer

1.0.1-1

junit

junit

要将 MP3 转换WAV,可以使用 Java 中的 JLayer 库和 Tritonus 库。 首先,您需要从以下网址下载 JLayer 库和 Tritonus 库: - JLayer: http://www.javazoom.net/javalayer/javalayer.html - Tritonus: http://www.tritonus.org/plugins.html 将这些库文件添加到您的 Java 项目中,并使用以下代码将 MP3 文件转换WAV 文件: ```java import java.io.*; import javax.sound.sampled.*; import javazoom.jl.decoder.*; public class MP3toWAVConverter { public static void convert(String filename) throws IOException, UnsupportedAudioFileException, Exception { String outputFilename = filename.replace(".mp3", ".wav"); InputStream in = new FileInputStream(filename); OutputStream out = new FileOutputStream(outputFilename); Decoder decoder = new Decoder(); AudioFormat format = new AudioFormat(44100, 16, 2, true, false); javax.sound.sampled.AudioInputStream ais = new javax.sound.sampled.AudioInputStream(new BufferedInputStream(new DecoderInputStream(in)), format, DecoderInputStream.getLength()); AudioSystem.write(ais, AudioFileFormat.Type.WAVE, out); out.close(); in.close(); } } ``` 在上面的代码中,我们使用 JLayer 库的 Decoder 类将 MP3 文件解码为音频流,然后使用 Java 内置的 AudioSystem 类将音频流写入 WAV 文件。 要使用上面的代码,只需调用 `MP3toWAVConverter.convert(filename)` 方法并传入要转换MP3 文件名。转换后的 WAV 文件将与 MP3 文件位于同一目录中,并且文件名将相同,只是扩展名不同。 注意,这种方法可能会导致转换后的 WAV 文件大小较大,因为 WAV 格式的音频文件通常比 MP3 格式的文件更大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值