1. 程式人生 > >java利用ffmpeg將amr、caf轉mp3格式

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");
	}