java利用ffmpeg將amr、caf轉mp3格式
最近再做一個專案,要將手機APP上的檔案上傳到伺服器上來,包括圖片、聲音、視訊檔案。起初只有Android版,大家知道,Android的錄音格式amr,在電腦上播放不出來,必須轉碼。因為之前只有Android版的,所以就用jave給方便的解決了。但是後來又增加了iPhone版,傳上來的錄音格式是caf。jave雖然支援幾十種音視訊格式,但是卻支援不了這個caf格式。後來也嘗試了lame,也是不行。網上的資料絕大部分是說在iPhone手機上轉的,可是我要在伺服器上轉。搞了一個星期,沒有一點進展。後來向同事請教,他們推薦我用ffmpeg,說這是個非常強大的工具,幾乎可以轉任何格式的音視訊,格式工廠都是用的他這個核心。而我試了一下格式工廠,也確實可以轉caf格式。終於柳暗花明。這也使我認識到團隊的力量,三個臭皮匠還訂一個諸葛亮呢,有問題還得和別人多交流。
言歸正傳。為了讓大家不再走彎路,介紹一下我是怎麼做的,其實很簡單。我是用socket上傳,當有一個檔案上傳完畢,如果是音訊檔案,我就把他轉成mp3格式。不管是amr格式還是caf格式,以及任何音訊格式,都是可以的。
首先,下載ffmpeg.exe,很容易搜到的,可以從官網上下。因為我們只是用來轉碼,就不介紹他的工作原理啦什麼的了。下載以後,在程式裡面直接執行這個ffmpeg.exe就可以了。轉換的方法程式碼如下:
/** * 將上傳的錄音轉為mp3格式 * @param webroot 專案的根目錄 * @param sourcePath 檔案的相對地址 */ public static void ToMp3(String webroot, String sourcePath){ //File file = new File(sourcePath); String targetPath = sourcePath+".mp3";//轉換後文件的儲存地址,直接將原來的檔名後加mp3字尾名 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 //釋放程序 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"); //刪除原來的檔案 //if(file.exists()){ //file.delete(); //} } catch (Exception e) { e.printStackTrace(); }finally{ //run呼叫lame解碼器最後釋放記憶體 run.freeMemory(); } }
有需要轉換的檔案,直接呼叫這個方法,傳入兩個引數,就可以了。 說明一下,這裡的webroot是絕對地址,也就是帶碟符的地址,如D:/tomcat/webroot這種。相對地址估計也是可以的。具體的編碼為mp3的時候那些引數我都沒有設定,像位元速率,聲道什麼的,因為只要能聽見聲音就行,又不是音樂,所以就讓他自動去轉吧。當然如果你有要求,也可以設定這些引數。
public static void main(String[] args) {
ToMp3("E:/workspace/ReportWeb/WebRoot/","audio/REC_20150126_175835.amr");
}