java實現windows下amr轉換為mp3(可實現微信語音和qq語音轉換)
最近做一個專案需要將微信的語音檔案放在頁面進行播放,查了好多資料發現,web頁面直接播放並沒有一個好的解決方案,於是就想到了先將amr檔案轉換成易於在頁面播放的mp3檔案,然後在進行播放,現在將amr檔案轉化為mp3檔案的幾種方式以及踩過的坑分享一下:
查了好多資料,總結一下,amr轉換mp3的方式有如下幾種:
1.通過jave.jar包實現(不可以轉微信及qq語音檔案);
我用的是:jave-1.0.2.zip
2.通過ffmpeg.exe實現(不可以轉微信及qq語音檔案);
需要配置環境變數
3.通過SILK v3編碼解碼方式實現(可以轉微信及qq語音檔案);
需要配置環境變數
下面對以上三種方式進行分解:
一、通過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/