原文:http://linjie.org/2015/08/06/amr%E6%A0%BC%E5%BC%8F%E8%BD%ACmp3%E6%A0%BC%E5%BC%8F-%E5%AE%8C%E7%BE%8E%E8%A7%A3%E5%86%B3Linux%E4%B8%8B%E8%BD%AC%E6%8D%A20K%E9%97%AE%E9%A2%98/
因項目需求,需要將 amr 格式的文件轉成 mp3格式。
網絡上提供的思路大多是使用jave-x-x.jar。
這個包確實有用,因為開發時是在windows環境中,測試轉換雖然報了異常:
it.sauronsoftware.jave.EncoderException: Duration: N/A, bitrate: N/A
但也確實轉換成功了,可以播放。
可是一旦部署到Linux環境當中,不是轉換失敗,就是轉換的文件為大小 0 k。百思不得其解。
原因
經過一些資料和源碼跟蹤,終於找到了原因。
jave的能轉換的原理其實就是調用外部的二進制可執行文件 ffmpeg
,打開它的jar包就可以發現,它里面內置了:jave原jar包截圖
。
所以實際上,jave就是封裝了一層對外部ffmpeg
的調用。
而windows上能轉換是因為:ffmpeg.exe 這個程序沒問題。
而Linux上轉換失敗也是因為 ffmpeg 這個可能版本太老或依賴庫缺失。
起初我以為是調用外部的ffmpeg,所以重新安裝編譯了Linux的ffmpeg,然並卵。
所以只能再想其他解決方案。
解決
知道原因之后,解決思路有兩種。
- 不使用jave ,將jave一些核心的代碼抽取出來,自己調用系統外部。
- 下載最新的ffmpeg,替換掉原先的ffmpeg。
第二種比較簡單,就直接用第二種吧。
下載和替換
下載站點:http://ffmpeg.org/download.html
然后選擇一個32位還是64位:
下載之后解壓,選擇其中的ffmpeg,替換掉。
其他!失敗看這里!
如果沒成功,或者轉換失敗,看這里。
在操作的時候,為了驗證服務器支持這種方式,你可以將下載回來的ffmpeg拷貝到你的服務器上,手動進行轉換一次,如果失敗,可以留言哦。
可以操作如下:
- 解壓文件(可以自己下載,也可以下載博主在最后提供的現成的jar包,直接解壓jar也,打開
.it/sauronsoftware/jave
目錄,也可以看到這個ffmpeg ) - 進入目錄,看到ffmpeg文件后,將其拷貝到Linux環境下。
- 准備一個amr文件,將兩個文件都拷貝到同一個目錄下,進行測試。如果准備好了,如圖:
arm和ffmpeg
-
接着先給ffmpeg加個執行權限
chmod +x ffmpeg
-
接着調用 ffmpeg 執行轉換下
./ffmpeg -i test.amr test.mp3
然后你會看到一堆的日志,並且可能還有提示,“test.amr: Input/output error”,但不要擔心,先不管,你查看下這個目錄下是否多了一個test.mp3 文件。如果有了,恭喜你,轉換成功了,嘗試播放下MP3
如果不行就到Tomcat下有個temp目錄,進入jave 目錄,挺多層的,進去看看有沒一個ffmpeg文件,刪除掉。