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檔案)