現象:Java Runtime.exec() 執行 ffmpeg 命令,Windows/Eclipse 正常,Linux 失敗。經調試發現 filepath 兩側雙引號導致參數解析異常。
Runtime.getRuntime().exec("/home/ffmpeg -i \" \" + filepath + \" \" -y ...");
exec(String) 會將整個字符串交給 /bin/sh -c 解析。filepath 本身無空格,雙引號會作為字面字符傳遞給 ffmpeg,導致其解析路徑帶引號而失敗。cmd.exe 對引號處理較寬容,故現象不一致。String cmd = "/home/ffmpeg -i '" + filepath + "' -y ...";
Runtime.getRuntime().exec(cmd);
缺點:filepath 不能包含單引號。\\\" → Shell 層面 \"):
String cmd = "/home/ffmpeg -i \\\"" + filepath + "\\\" -y ...";
ProcessBuilder pb = new ProcessBuilder(
"/home/ffmpeg", "-i", filepath, "-y", "-ab", "32", "-ar", "22050", "-qscale", "10", "-r", "15", "/home/ffmpeg/temp/");
pb.start();
凡涉及外部命令執行,優先使用 ProcessBuilder 參數列表形式,徹底消除引號/空格/特殊字符轉義地獄。
避免字符串拼接命令,用 ProcessBuilder 參數數組,Linux 下 ffmpeg 路徑解析即可正常工作。