1. 程式人生 > >java實現windows下amr轉換為mp3(可實現微信語音和qq語音轉換)

java實現windows下amr轉換為mp3(可實現微信語音和qq語音轉換)

最近做一個專案需要將微信的語音檔案放在頁面進行播放,查了好多資料發現,web頁面直接播放並沒有一個好的解決方案,於是就想到了先將amr檔案轉換成易於在頁面播放的mp3檔案,然後在進行播放,現在將amr檔案轉化為mp3檔案的幾種方式以及踩過的坑分享一下:

查了好多資料,總結一下,amr轉換mp3的方式有如下幾種:

1.通過jave.jar包實現(不可以轉微信及qq語音檔案);

我用的是:jave-1.0.2.zip

jave.jar包官方下載

2.通過ffmpeg.exe實現(不可以轉微信及qq語音檔案);

需要配置環境變數

ffmpeg.exe包官方下載

3.通過SILK v3編碼解碼方式實現(可以轉微信及qq語音檔案);

需要配置環境變數

SILK v3相關內容下載

cygwin軟體下載

下面對以上三種方式進行分解:

一、通過jave.jar包實現(不可以轉微信及qq語音檔案):

將jave.jar包匯入專案:

package com.nnbrightstar.lbtm.common.utils;
 
import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.InputFormatException; import java.io.File; public class ChangeAudioFormat { public static void main(String[] args) throws Exception { File source = new File("D:/1.amr"); String targetPath = "D:/2.mp3"; transcodingToMP3(source,targetPath); }
/** * jave包實現將amr格式轉為mp3格式 * @param source * @param targetPath * @return */ public static boolean transcodingToMP3(File source,String targetPath){ //File source = new File("C:/Users/Administrator/Downloads/廚房裡的爆炸案.mpg"); boolean flag = false; File target = new File(targetPath); AudioAttributes audio = new AudioAttributes();// 音訊屬性 audio.setCodec("libmp3lame");// libmp3lame 音訊編碼 audio.setBitRate(new Integer(128000));// 音訊位元率 audio.setChannels(new Integer(1));// 聲道 audio.setSamplingRate(new Integer(44100));// 取樣率 EncodingAttributes attrs = new EncodingAttributes();// 視訊屬性 attrs.setFormat("mp3");// 轉碼格式 attrs.setAudioAttributes(audio);// 音訊屬性 Encoder encoder = new Encoder();// 建立解碼器 long beginTime = System.currentTimeMillis(); try { // 獲取時長 MultimediaInfo m = encoder.getInfo(source); System.out.println(m.getDuration()/1000 + "秒"); System.out.println("獲取時長花費時間是:" + ((System.currentTimeMillis() - beginTime))/1000 + "秒"); beginTime = System.currentTimeMillis(); encoder.encode(source, target, attrs); System.out.println("音訊轉碼花費時間是:" + ((System.currentTimeMillis() - beginTime)/1000) + "秒"); flag = true; } catch (IllegalArgumentException e) { flag = false; e.printStackTrace(); } catch (InputFormatException e) { flag = false; e.printStackTrace(); } catch (EncoderException e) { flag = false; e.printStackTrace(); } return flag; } }

二、通過ffmpeg.exe實現(不可以轉微信及qq語音檔案):

ffmpeg是一個非常強大的音視訊處理工具,直接將下載好的Windows版本的ffmpeg解壓,然後將其中bin目錄下ffmpeg.exe檔案匯入到專案中(或者直接使用程式碼讀取本地的ffmpeg.exe執行檔案)。

1.使用本地的ffmpeg.exe執行檔案,直接通過File獲取:

2、將ffmpeg.exe執行檔案匯入到專案中,通過 URL url = Thread.currentThread().getContextClassLoader().getResource("ffmpeg/windows/"); 來獲取

不管用那種形式實現,效果是一樣的,示例程式碼如下:

package com.nnbrightstar.lbtm.common.utils;
 
import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.InputFormatException;
import java.io.File;
 
public class ChangeAudioFormat {
    public static void main(String[] args) throws Exception {
        String sourcePath = "D:/1.amr"; 
        String targetPath = "D:/1.mp3";
        ToMp3(sourcePath,targetPath);
    }
 
   /** 
     * ffmpeg.exe軟體實現將amr格式轉為mp3格式 
     * @param webroot 專案的根目錄 
     * @param sourcePath 檔案的相對地址 
     */  
    public static void ToMp3(String sourcePath, String targetPath){  
        Runtime run = null;    
        try {    
            run = Runtime.getRuntime();    
            long start=System.currentTimeMillis();    
            //Process p=run.exec(webroot+"files/ffmpeg -i "+webroot+sourcePath+" -acodec libmp3lame "+webroot+targetPath);//執行ffmpeg.exe,前面是ffmpeg.exe的地址,中間是需要轉換的檔案地址,後面是轉換後的檔案地址。-i是轉換方式,意思是可編碼解碼,mp3編碼方式採用的是libmp3lame
            String cmd = "D:/ffmpeg/bin/ffmpeg -i "+sourcePath+" -acodec libmp3lame "+targetPath;
            Process p=run.exec(cmd);//執行ffmpeg.exe,前面是ffmpeg.exe的地址,中間是需要轉換的檔案地址,後面是轉換後的檔案地址。-i是轉換方式,意思是可編碼解碼,mp3編碼方式採用的是libmp3lame
            System.out.println(cmd);
            //釋放程序    
            p.getOutputStream().close();    
            p.getInputStream().close();    
            p.getErrorStream().close();    
            p.waitFor();    
            long end=System.currentTimeMillis();    
            System.out.println(sourcePath+" convert success, costs:"+(end-start)+"ms");      
        } catch (Exception e) {    
            e.printStackTrace();    
        }finally{    
            //run呼叫lame解碼器最後釋放記憶體    
            run.freeMemory();    
        }  
    }
}

環境變數配置:

(1)ffmpeg

D:\ffmpeg\bin

(2)Path

.;%ffmpeg%;,;%cygwin%;

 

三、通過SILK v3編碼解碼方式實現(可以轉微信及qq語音檔案):

SILK v3編碼是Skype向第三方開發人員和硬體製造商提供免版稅認證(RF)的Silk寬頻音訊編碼器,Skype後來將其開源。具體可見Wikipedia

轉換QQ的語音資訊(去年又是微信的語言資訊),做成Shell指令碼,具體可見Github專案地址:https://github.com/kn007/silk-v3-decoder

需要gcc和ffmpeg。gcc是拿來編譯silk v3 decoder原始碼,ffmpeg是拿來轉換格式的。

1.Linux下可執行,呼叫很簡單,只需一句shell命令:

sh convert.sh 1.amr mp3

其中:“1.amr”是你要轉換的原始檔(QQ常見為slk,微信常見為amr);後面的“mp3”是你要輸出的格式。

首次使用會編譯silk v3 decoder,第二次以後就不用了。

2.windows下使用下載好的專案包中的windows資料夾下的silk2mp3.exe可以實現檔案型別轉換。

3.那麼問題來了,我需要在windows下使用java程式碼直接呼叫可以再Linux下面執行的shell命令:

首先我們需要在windows系統下可以執行shell命令,然後讓cmd.exe中也可以執行相應的shell命令就可以了。

Linux的shell指令碼提供了大量方便的工具,如:awk、grep、more、tail、wc等等,方便使用者對檔案、資料的分析,但是windows相對來說就沒那麼方便,要分析一個數據可能需要自己程式設計、編譯然後才能對一些資料進行分析,對於一些輕量級的資料,不如shell指令碼好用。
下載cygwin對應於自己windows作業系統的版本:32位或64位
(cygwin是一個在windows平臺上執行的unix模擬環境,是cygnus solutions公司開發的自由軟體)
開啟cygwin,就可以看到熟悉的命令列提示了,shell環境對應的根目錄是軟體的安裝目錄.
開始使用linux命令:grep、awk、less、vi等等,如果發現有缺少什麼命令,重新執行setup.exe安裝程式,搜尋需求的命令,叉選上即可安裝。

cygwin安裝:
(1)雙擊setup.exe
(2)按照安裝提示“下一步”
(3) 選擇從“網際網路”安裝:
(4)選擇安裝的路徑,一般是C:\Cygwin,選擇本地臨時目錄,用於存放下載的軟體;選擇您連線網際網路的方式,一般選“直接連線”就可以了。
(5)選擇下載源.
(6)根據安裝提示,選擇需要安裝的軟體包,完成安裝。


cygwin使用:
(1)雙擊桌面的Cygwin圖示,即可啟動Cygwin裡的Bash。
(2)或者,你可將C:/Cygwin/bin加到%PATH%當中,您就可以直接在cmd.exe裡面使用Linux命令了,比如less, cat, wc , wget
(3)如果您有一個Bash指令碼,您可以直接用C:/Cygwin/bin/bash.exe X:/scripts/Monitor.sh的形式呼叫。

 

實現程式碼:

package com.nnbrightstar.lbtm.common.utils;
 
import it.sauronsoftware.jave.AudioAttributes;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.EncodingAttributes;
import it.sauronsoftware.jave.InputFormatException;
import java.io.File;
 
public class ChangeAudioFormat {
    public static void main(String[] args) throws Exception {
        ToMp3();
    }
 
    /** 
     * cygwin軟體實現將amr格式轉為mp3格式 
     */  
    public static void ToMp3(){  
        Runtime run = null;    
        try {    
            run = Runtime.getRuntime();    
            long start=System.currentTimeMillis();    
            //F:/Cygwin/bin/bash.exe呼叫cygwin執行linux命令,C:/Users/Administrator/Desktop/silk-v3-decoder-master/converter.sh是要執行的檔案,1.amr是要轉換的檔案,mp3要輸出的格式
            String cmd = "F:/Cygwin/bin/bash.exe C:/Users/Administrator/Desktop/silk-v3-decoder-master/converter.sh 1.amr mp3";
            Process p=run.exec(cmd);//執行cygwin,前面是cygwin的地址,中間是需要轉換的檔案地址,後面是轉換後的檔案的格式。
            System.out.println(cmd);
            //釋放程序    
            p.getOutputStream().close();    
            p.getInputStream().close();    
            p.getErrorStream().close();    
            p.waitFor();    
            long end=System.currentTimeMillis();    
            System.out.println(sourcePath+" convert success, costs:"+(end-start)+"ms");      
        } catch (Exception e) {    
            e.printStackTrace();    
        }finally{    
            //run呼叫lame解碼器最後釋放記憶體    
            run.freeMemory();    
        }  
    }
}        

 

如何完整安裝cygwin:

(1)選擇Install from internet

(2)選擇安裝目錄,這個目錄相當於是安裝好之後的Linux根目錄

 

(3)這個目錄之Cygwin的安裝檔案目錄和下載的檔案目錄

 

(4)點下一步到

 

敲黑板,這不很關鍵,直接關係到能不能安裝成功,我之前的N次失敗原因都在這裡。國內沒有合適的下載源,這裡得手動新增下:http://mirrors.163.com/cygwin/ 。新增163的映象下載源,Next step:

(5)接在來選擇安裝的軟體,Search處分別搜尋 gcc-core、gcc-g++、make、gdb、binutils,選擇devel目錄下的相關版本,注意有bin和src,只應用的話選擇二進位制檔案即可。然後一路無腦點,下載檔案就看各位的網速了;

 

 

 

環境變數配置:

(1)cygwin

F:\Cygwin\bin

(2)Path

.;%ffmpeg%;,;%cygwin%;

 

參考連結:

https://zhidao.baidu.com/question/329657466310314125.html

https://blog.csdn.net/u012778714/article/details/74012013

https://kn007.net/topics/decoding-qq-wechat-silk-v3-encoded-audio-to-mp3-or-other-formats/