1. 程式人生 > >java任意音訊格式轉換MP3格式

java任意音訊格式轉換MP3格式

寫在前面

Java音訊視訊編碼器,本文例項將任何音訊格式轉換為MP3格式

您還可以調整音訊頻大小,更改其大小和比例等

本文例項實用於任何window,macos,linux作業系統

使用此專案只需要,匯入jar包,簡單易操作.引數只有兩個:

①一個File型別的source物件:

         //File source = new File("C:\\Users\\source.m4a");
         File source = new File("file path source");

②一個File型別target物件,
         // File target = new File("C:\\Users\\target.mp3");
         File target = new File("file path target");

Example

public class ConvertingAnyAudioToMp3_Example{ 



         //測試demo|
        //使用此jar只需要,原始檔路徑和要生成目標檔案的路徑

       public static void main(String[] args) {
        

        ConvertingAnyAudioToMp3_Example  cAATM  =  new ConvertingAnyAudioToMp3_Example();
         //C:\\Users\\source.m4a
         File source = new File("file path source");
         //C:\\Users\\target.mp3
         File target = new File("file path target");
         boolean b = cAATM .ConvertingAnyAudioToMp3WithAProgressListener(source,target);
         System.out.println(b);
  

 }
    //以下程式碼不用改動,直接使用

   /**
     * 第一個引數source表示要解碼的原始檔。
     * 
     * 第二個引數target是將要建立和編碼的目標檔案。
     * 
     * 
     * 請注意,此方法是阻塞的:只有在轉碼操作完成(或失敗)後,該方法才會返回
     * 
     * @return boolean
     */
    public boolean ConvertingAnyAudioToMp3WithAProgressListener(java.io.File source, java.io.File target) {
        
        ConvertProgressListener listener = new ConvertProgressListener();

        boolean succeeded = true;

        try {
            /*
             * 自定義 TODO
             * 
             */
//            File source = new File("file path source");
            /*
             * 自定義 TODO
             * 
             */
//            File target = new File("file path target");

            // Audio Attributes/音訊編碼屬性
            AudioAttributes audio = new AudioAttributes();
            /*
             * 它設定將用於音訊流轉碼的編解碼器的名稱。您必須從當前Encoder例項的getAudioEncoders()方法返回的列表中選擇一個值。否則,
             * 您可以傳遞AudioAttributes.DIRECT_STREAM_COPY特殊值,該值需要原始檔中原始音訊流的副本。
             */
            audio.setCodec("libmp3lame");
            /*
             * 它設定新重新編碼的音訊流的位元率值。如果未設定位元率值,編碼器將選擇預設值。該值應以每秒位數表示。例如,如果你想要128 kb /
             * s位元率,你應該呼叫setBitRate(new Integer(128000))。
             */
            audio.setBitRate(128000);
            /* 它設定將在重新編碼的音訊流中使用的音訊通道的數量(1 =單聲道,2 =立體聲)。如果未設定通道值,編碼器將選擇預設值。 */
            audio.setChannels(2);
            /*
             * 它設定新重新編碼的音訊流的取樣率。如果未設定取樣率值,編碼器將選擇預設值。該值應以赫茲表示。例如,如果您想要類似CD的44100
             * Hz取樣率,則應呼叫setSamplingRate(new Integer(44100))。
             */
            audio.setSamplingRate(44100);
            /* 可以呼叫此方法來改變音訊流的音量。值256表示沒有音量變化。因此,小於256的值是音量減小,而大於256的值將增加音訊流的音量。 */
            audio.setVolume(new Integer(256));

            // Encoding attributes/編碼屬性
            EncodingAttributes attrs = new EncodingAttributes();
            /*
             * 它設定將用於新編碼檔案的流容器的格式。給定引數表示格式名稱。
             * 編碼格式名稱有效且僅在它出現在正在使用的Encoder例項的getSupportedEncodingFormats()方法返回的列表中時才受支援。
             */
            attrs.setFormat("mp3");
            /* 它設定音訊編碼屬性。如果從未呼叫過新的EncodingAttributes例項,或者給定引數為null,則編碼檔案中不會包含任何音訊流 */
            attrs.setAudioAttributes(audio);
            /*
             * 它為轉碼操作設定偏移量。原始檔將從其開始的偏移秒開始重新編碼。例如,如果您想剪下原始檔的前五秒,
             * 則應在傳遞給編碼器的EncodingAttributes物件上呼叫setOffset(5)。
             */
            // attrs.setOffset(5F);
            /*
             * 它設定轉碼操作的持續時間。只有源的持續時間秒才會在目標檔案中重新編碼。例如,如果您想從源中提取和轉碼30秒的一部分,
             * 則應在傳遞給編碼器的EncodingAttributes物件上呼叫setDuration(30)
             */
            // attrs.setDuration(30F);

            // Encode/編碼
            Encoder encoder = new Encoder();
            encoder.encode(new MultimediaObject(source), target, attrs, listener);

        } catch (Exception ex) {
            ex.printStackTrace();
            succeeded = false;
        }
        return succeeded;
    }

    public class ConvertProgressListener implements EncoderProgressListener {

        /*編碼器在分析原始檔後呼叫此方法。該資訊引數是例項 ws.schild.jave.MultimediaInfo類,它代表了有關源音訊和視訊流及其容器的資訊。*/
        public void sourceInfo(MultimediaInfo info) {
            // TODO Auto-generated method stub

        }
        /*每次完成編碼操作的進度時,編碼器呼叫該方法。所述permil引數是表示通過當前操作到達點的值和它的範圍是從0(操作剛開始)到1000(操作完成)*/
        public void progress(int permil) {
            double progress = permil / 1000.00;                                    
            System.out.println(progress); 

        }

        /* 編碼器呼叫該方法以通知關於程式碼轉換操作的訊息(通常訊息是警告)。 */
        public void message(String message) {
            // TODO Auto-generated method stub

        }

    }
}