最近再做一個項目,要將手機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");
}