1. 程式人生 > >【原創】音訊轉碼-Mp3轉AMR--轉載請註明出處

【原創】音訊轉碼-Mp3轉AMR--轉載請註明出處

一、常見音訊轉碼方案

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