【原創】音訊轉碼-Mp3轉AMR--轉載請註明出處
阿新 • • 發佈:2018-12-24
一、常見音訊轉碼方案
1.採用阿里雲OSS進行轉碼
採用阿里雲OSS僅支援amr -> mp3格式的轉碼,但是不支援mp3 -> amr 格式的轉碼,呼叫後會丟擲 amr 格式不支援的異常。OSS轉碼為非同步轉碼,呼叫時是通知OSS的轉碼服務,將這個轉碼任務加入佇列,完成轉碼後,輸入的地址key才是有效的地址key,在呼叫轉碼服務後不能直接進行下載,轉換為base64編碼給客戶端。
2.採用 jave 轉碼
採用java 的第三方jar包 jave 進行轉碼,目前網上的常見部落格均為舊版的jave的轉碼jar包,新版的jar包已經更新到了2.x的版本,在2.x的版本中,已經由部分API與之前的。在檢視原始碼後發現,該轉碼包的原理大致為將一個編碼檔案複製到本地,然後使用該檔案進行轉碼,並且該轉碼與作業系統有關,只支援windows 和 mac ,並且不支援mac os x,原因為在使用mac os x進行執行轉碼時,會出現無法識別該作業系統導致的空指標異常問題。
3.採用 ffmpeg 進行轉碼
需要將檔案由客戶端先發送到服務端,然後服務端儲存到本地,再在本地執行ffmepg指令碼檔案進行轉碼,轉碼後將檔案讀取到服務端記憶體,傳送給客戶端。
4.採用網易雲物件儲存轉碼
可以將檔案傳輸到網易雲物件儲存,然後呼叫指定介面,進行轉碼並下載轉碼後的檔案。
二、採用 ffmpeg 進行轉碼
public static final String AMR_TO_MP3_COMMAND = "ffmpeg -i {0}.amr {1}.mp3"; public static final String MP3_TO_AMR_COMMAND = "ffmpeg -i {0}.mp3 -ar 8000 {1}.amr -ar 8000"; public static boolean executeLinuxCmd(String cmd) { System.out.println("got cmd job : " + cmd); Runtime run = Runtime.getRuntime(); try { Process process = run.exec(cmd); InputStream in = process.getInputStream(); BufferedReader bs = new BufferedReader(new InputStreamReader(in)); // System.out.println("[check] now size \n"+bs.readLine()); StringBuffer out = new StringBuffer(); byte[] b = new byte[8192]; for (int n; (n = in.read(b)) != -1;) { out.append(new String(b, 0, n)); } System.out.println("job result [" + out.toString() + "]"); in.close(); // process.waitFor(); process.destroy(); return true; } catch (IOException e) { e.printStackTrace(); } return false; }