一、常見音頻轉碼方案
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;
}