MP3在Java WAV转换 [英] mp3 to wav conversion in java

查看:4020
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆