MP3在Java WAV转换 [英] mp3 to wav conversion in java
本文介绍了MP3在Java WAV转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的code到MP3转换为WAV是:
包声卡1;进口的java.io.File;
进口javax.sound.sampled.AudioFileFormat;
进口javax.sound.sampled.AudioFormat中;
进口javax.sound.sampled.AudioInputStream中;
进口javax.sound.sampled.AudioSystem;公共类的NewClass {
公共静态无效的主要(字串[] args){
尝试{
AudioFileFormat inputFileFormat = AudioSystem.getAudioFileFormat(新文件(C:\\\\ 1.MP3));
AIS的AudioInputStream = AudioSystem.getAudioInputStream(新文件(C:\\\\ 1.MP3)); AudioFormat的AudioFormat的= ais.getFormat(); 的System.out.println(文件格式类型:+ inputFileFormat.getType());
的System.out.println(文件格式字符串:+ inputFileFormat.toString());
的System.out.println(文件长度:+ inputFileFormat.getByteLength());
的System.out.println(帧长度:+ inputFileFormat.getFrameLength());
的System.out.println(频道:+ audioFormat.getChannels());
的System.out.println(编码+ audioFormat.getEncoding());
的System.out.println(帧率:+ audioFormat.getFrameRate());
的System.out.println(外形尺寸为:+ audioFormat.getFrameSize());
的System.out.println(采样率:+ audioFormat.getSampleRate());
的System.out.println(样本大小(比特):+ audioFormat.getSampleSizeInBits());
的System.out.println(大端+ audioFormat.isBigEndian());
的System.out.println(音频格式字符串:+ audioFormat.toString()); 恩的AudioInputStream codedASI = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED,AIS); 尝试{
INT I = AudioSystem.write(EN codedASI,AudioFileFormat.Type.WAVE,新的文件(C:\\\\ converted.wav));
的System.out.println(写入字节:+ I);
}赶上(例外五){
e.printStackTrace();
}
}赶上(例外五){
e.printStackTrace();
}
}
}
但我得到下面的输出:
文件格式类型:MP3
文件格式字符串:MP3(.MP3)文件,字节长度:9631340,数据格式:MPEG1L3 48000.0赫兹,每个样品未知位,立体声,未知帧大小,41.666668帧/秒,帧长:10030
文件长度:9631340
帧长度:10030
渠道:2
编码:MPEG1L3
帧速率:41.666668
外形尺寸为:-1
采样率:48000.0
样品尺寸(位):-1
大端:真
音频格式字符串:MPEG1L3 48000.0赫兹,每个样品,音响,未知帧大小未知位,41.666668帧/秒,
java.lang.ArrayIndexOutOfBoundsException:1
在org.tritonus.sampled.convert.javalayer.MpegFormatConversionProvider$De$c$cdMpegAudioInputStream$DMAISObuffer.append(MpegFormatConversionProvider.java:386)
在javazoom.jl.de coder.Obuffer.appendSamples(来源不明)
在javazoom.jl.de coder.SynthesisFilter.compute_pcm_samples(来源不明)
在javazoom.jl.de coder.SynthesisFilter.calculate_pcm_samples(来源不明)
在javazoom.jl.de coder.LayerIIIDe coder.de code(来源不明)
在javazoom.jl.de coder.LayerIIIDe coder.de codeFrame(来源不明)
在javazoom.jl.de coder.De coder.de codeFrame(来源不明)
在org.tritonus.sampled.convert.javalayer.MpegFormatConversionProvider$De$c$cdMpegAudioInputStream.execute(MpegFormatConversionProvider.java:307)
在org.tritonus.share.TCircularBuffer.read(TCircularBuffer.java:138)
在org.tritonus.share.sampled.convert.TAsynchronousFilteredAudioInputStream.read(TAsynchronousFilteredAudioInputStream.java:194)
在javax.sound.sampled.AudioInputStream.read(AudioInputStream.java:292)
在com.sun.media.sound.PCMtoPCM codeC $ PCMtoPCM codecStream.read(PCMtoPCM codec.java:506)
在com.sun.media.sound.SunFileWriter $ NoCloseInputStream.read(SunFileWriter.java:199)
在java.io.SequenceInputStream.read(SequenceInputStream.java:208)
在java.io.SequenceInputStream.read(SequenceInputStream.java:211)
在java.io.InputStream.read(InputStream.java:101)
在com.sun.media.sound.WaveFileWriter.writeWaveFile(WaveFileWriter.java:247)
在com.sun.media.sound.WaveFileWriter.write(WaveFileWriter.java:145)
在javax.sound.sampled.AudioSystem.write(AudioSystem.java:1354)
在audio1.NewClass.main(NewClass.java:33)
谁能帮我什么,我做错了什么?
解决方案
公共静态的byte [] getAudioDataBytes(字节[] sourceBytes,AudioFormat的AudioFormat的)抛出UnsupportedAudioFileException,抛出:IllegalArgumentException,异常{
如果(sourceBytes == NULL || sourceBytes.length == 0 || AudioFormat的== NULL){
抛出新抛出:IllegalArgumentException(非法参数传递给此方法);
} ByteArrayInputStream的BAIS = NULL;
ByteArrayOutputStream BAOS = NULL;
的AudioInputStream sourceAIS = NULL;
的AudioInputStream convert1AIS = NULL;
的AudioInputStream convert2AIS = NULL; 尝试{
拜斯=新ByteArrayInputStream进行(sourceBytes);
sourceAIS = AudioSystem.getAudioInputStream(拜斯);
AudioFormat的sourceFormat = sourceAIS.getFormat();
AudioFormat的convertFormat =新AudioFormat的(AudioFormat.Encoding.PCM_SIGNED,sourceFormat.getSampleRate(),16,sourceFormat.getChannels(),sourceFormat.getChannels()* 2,sourceFormat.getSampleRate(),假);
convert1AIS = AudioSystem.getAudioInputStream(convertFormat,sourceAIS);
convert2AIS = AudioSystem.getAudioInputStream(AudioFormat的,convert1AIS); BAOS =新ByteArrayOutputStream(); 字节[]缓冲区=新的字节[8192];
而(真){
INT readCount = convert2AIS.read(缓冲液,0,buffer.length);
如果(readCount == -1){
打破;
}
baos.write(缓冲液,0,readCount);
}
返回baos.toByteArray();
}赶上(UnsupportedAudioFileException uafe){
//uafe.printStackTrace();
扔uafe;
}赶上(IOException异常IOE){
//ioe.printStackTrace();
抛出IOE;
}赶上(抛出:IllegalArgumentException IAE){
//iae.printStackTrace();
扔IAE;
}赶上(例外五){
//e.printStackTrace();
Ë扔掉;
}最后{
如果(BAOS!= NULL){
尝试{
baos.close();
}赶上(例外五){
}
}
如果(convert2AIS!= NULL){
尝试{
convert2AIS.close();
}赶上(例外五){
}
}
如果(convert1AIS!= NULL){
尝试{
convert1AIS.close();
}赶上(例外五){
}
}
如果(sourceAIS!= NULL){
尝试{
sourceAIS.close();
}赶上(例外五){
}
}
如果(BAIS!= NULL){
尝试{
bais.close();
}赶上(例外五){
}
}
}
}
下面sourceBytes重新presents MP3文件或WAV文件。 AudioFormat的是要在其中转换PCM格式。此外,我们需要把mp3spi.jar,tritonus_mp3.jar,JL的* .jar,tritonus_share.jar从javazoom.com在类路径中。希望这可以帮助其他。
Java 7的版本:
公共静态的byte [] getAudioDataBytes(字节[] sourceBytes,AudioFormat的AudioFormat的)抛出UnsupportedAudioFileException,抛出:IllegalArgumentException,异常{
如果(sourceBytes == NULL || sourceBytes.length == 0 || AudioFormat的== NULL){
抛出新抛出:IllegalArgumentException(非法参数传递给此方法);
} 尝试(最终ByteArrayInputStream的拜斯=新ByteArrayInputStream进行(sourceBytes);
最终的AudioInputStream sourceAIS = AudioSystem.getAudioInputStream(拜斯)){
AudioFormat的sourceFormat = sourceAIS.getFormat();
AudioFormat的convertFormat =新AudioFormat的(AudioFormat.Encoding.PCM_SIGNED,sourceFormat.getSampleRate(),16,sourceFormat.getChannels(),sourceFormat.getChannels()* 2,sourceFormat.getSampleRate(),假);
尝试(最终的AudioInputStream convert1AIS = AudioSystem.getAudioInputStream(convertFormat,sourceAIS);
最终的AudioInputStream convert2AIS = AudioSystem.getAudioInputStream(AudioFormat的,convert1AIS);
最后ByteArrayOutputStream BAOS =新ByteArrayOutputStream()){
字节[]缓冲区=新的字节[8192];
而(真){
INT readCount = convert2AIS.read(缓冲液,0,buffer.length);
如果(readCount == -1){
打破;
}
baos.write(缓冲液,0,readCount);
}
返回baos.toByteArray();
}
}
}
Maven的:
<&依赖性GT;
<&的groupId GT; com.google code.soundlibs< /的groupId>
<&的artifactId GT; mp3spi< / artifactId的>
<&版GT; 1.9.5-1< /版本>
< /依赖性>
<&依赖性GT;
<&的groupId GT; com.google code.soundlibs< /的groupId>
<&的artifactId GT; jlayer< / artifactId的>
<&版GT;&1.0.1-1 LT; /版本>
<&排除GT;
<&排斥GT;
<&的groupId GT;的JUnit< /的groupId>
<&的artifactId GT;的JUnit< / artifactId的>
< /排除>
< /排除>
< /依赖性>
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:
<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>
这篇关于MP3在Java WAV转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文