天天看點

Java內建SOX開發一、項目痛點二、編寫Dockerfile三、代碼開發四、效果示範(例如:提取雙聲道錄音中的右聲道)

Java內建SOX開發

  • 一、項目痛點
  • 二、編寫Dockerfile
  • 三、代碼開發
  • 四、效果示範(例如:提取雙聲道錄音中的右聲道)
    • windows系統
    • linux系統

一、項目痛點

  • 1、項目需要做“提取雙聲道錄音中的右聲道”的功能,故需要用到sox。但是sox需要安裝,不能直接像依賴一個jar包一樣簡單。
  • 2、網上能找到安裝了sox的docker鏡像,但是裡面沒有java環境,或者是有java環境卻沒有sox,兩者不能兼得。
  • 3、如果直接在sox docker中安裝java,或者是在java docker中安裝sox,可能都會導緻docker鏡像過大;故本文提供了一種思路:就是把sox二進制檔案直接拷貝到java的docker鏡像中(這種方法制作的sox鏡像隻比之前多了2M !!)。

二、編寫Dockerfile

  • 1、建一個空檔案夾,在裡面放如下幾個檔案(sox是sox安裝的二進制檔案;lib開頭的兩個檔案sox依賴的庫)

    PS:下載下傳位址:免安裝sox二進制檔案下載下傳

    Java內建SOX開發一、項目痛點二、編寫Dockerfile三、代碼開發四、效果示範(例如:提取雙聲道錄音中的右聲道)
  • 2、其中的基礎鏡像是我這邊,大家可以把其換成任意一個jdk鏡像(例如:mcr.microsoft.com/java/jdk)
FROM registry:5000/jdk8:base
COPY lib* /usr/local/lib/
COPY sox  /usr/local/bin/
           

三、代碼開發

  • 下面是Sox開發的示例:

    其實思路就是:先在系統中安裝好sox環境,然後執行shell指令

import java.io.*;

public class SoxUtil {

    public static final String WORK_PATH_SOX = "/home/sox-img/";

    private void execute(String command) throws Exception {
        boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("windows");
        System.out.println("isWindows=" + isWindows);

        ProcessBuilder pb = new ProcessBuilder();
        if (isWindows) {//其實可以不考慮windows環境,不過是為了本地調試用
            pb.command("cmd.exe", "/c", command);
        } else {
            pb.command("sh", "-c", command);
        }
        pb.directory(new File(WORK_PATH_SOX));
        Process process = pb.start();
        String result = convertStreamToStr(process.getInputStream());
        System.out.println(result);
    }

    /**
     * 把inputStream變為字元串
     *
     * @param is
     * @return
     * @throws IOException
     */
    private String convertStreamToStr(InputStream is) throws IOException {
        if (is != null) {
            Writer writer = new StringWriter();
            char[] buffer = new char[1024];
            try {
                Reader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                int n;
                while ((n = reader.read(buffer)) != -1) {
                    writer.write(buffer, 0, n);
                }
            }catch (Exception e) {
                e.printStackTrace();
            } finally {
                is.close();
            }
            return writer.toString();
        } else {
            return "";
        }
    }

    public static void main(String[] args) throws Exception {
        SoxUtil sox = new SoxUtil();
        sox.execute(args[0]);
    }
}

           

四、效果示範(例如:提取雙聲道錄音中的右聲道)

windows系統

  • windows示範需要寫sox安裝的絕對路徑,例如:
D://sox-14-4-2/sox.exe E://sox/t1.wav E://sox/t1_r.wav remix 2
           
  • 執行 java SoxUtil “D://sox-14-4-2/sox.exe E://sox/t1.wav E://sox/t1_r.wav remix 2” 即可(這裡是指令行執行,也可以程式調用。這裡不再示範)

linux系統

先執行javac SoxUtil.java編譯,再執行下面的代碼(它會取提取t2.wav中的單聲道,并生成aaa.wav檔案)

Java內建SOX開發一、項目痛點二、編寫Dockerfile三、代碼開發四、效果示範(例如:提取雙聲道錄音中的右聲道)