2014-09-19 25 views
1

我這樣做:ProcessBuilder構造函數參數如何工作?

String[] command = {ffmpegLoc+"ffmpeg.exe", 
      "-i ", 
      "\""+dir+params.getString(4)+".flv"+"\"", 
      "-copyts", 
      "-crf 18", 
      "-profile:v baseline", 
      "-level 3.0", 
      "-pix_fmt yuv420p", 
      "-preset veryslow", 
      "\""+dir+params.getString(4)+".mp4"+"\""}; 
    try { 
     getLogger().info("ffmpeg command " + command); 
     ProcessBuilder builder = new ProcessBuilder(command); 
     builder.redirectErrorStream(true); 
     getLogger().info("Starting process"); 
     Process process = builder.start(); 
     InputStream stream = process.getInputStream(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String line = null; 
     while((line = in.readLine()) != null) { 
      System.out.println(line); 
     } 
     process.waitFor(); 

而且我得到的ffmpeg這個錯誤,它正確初始化:

Unrecognized option 'i '. 
Error splitting the argument list: Option not found 

所以我想:「也許我並不需要每個參數拆分爲數組」

所以我替換此命令:

String[] command = {ffmpegLoc+"ffmpeg.exe", 
       "-i " + "\""+dir+params.getString(4)+".flv"+"\"" + " -copyts -crf 18 -profile:v baseline -level 3.0 -pix_fmt yuv420p -preset veryslow "+"\""+dir+params.getString(4)+".mp4"+"\""}; 

現在我得到這樣的:

Unrecognized option 'i C:/Program'. 
Error splitting the argument list: Option not found 

什麼i發生之前到該連字符?

這些雙引號將路徑包裝到.flv文件中發生了什麼?

這到底是怎麼回事?

編輯:

我放棄了逃脫雙引號,按照this答案,現在我得到這樣的:

Unrecognized option 'i C:/Program Files (x86)/Wowza Media Systems/Wowza Streaming Engine 4.1.0/content/recorder/vid_test001.flv -copyts -crf 18 -profile:v baseline -level 3.0 -pix_fmt yuv420p -preset veryslow C:/Program Files (x86)/Wowza Media Systems/Wowza Streaming Engine 4.1.0/content/recorder/vid_test001.mp4'. 
Error splitting the argument list: Option not found 

又在i前面是連字符缺失。

編輯2:

讓我們將它們合併:沒有逃脫雙引號與參數結合各自在自己的索引:

String[] command = {ffmpegLoc+"ffmpeg.exe", 
      "-i", 
      dir+params.getString(4)+".flv", 
      "-copyts", 
      "-crf 18", 
      "-profile:v baseline", 
      "-level 3.0", 
      "-pix_fmt yuv420p", 
      "-preset veryslow", 
      dir+params.getString(4)+".mp4"}; 

的ffmpeg現在給我:

Unrecognized option 'crf 18'. 

所以我們到達了我們遇到第一個空白的地方,然後失敗了。

回答

3

當您創建一個字符串數組時,假設您執行命令行時shell執行的一些工作。所以這就是爲什麼雙引號是不必要的。但是您需要將選項名稱和選項值分開爲單獨的字符串;這就是shell將它們傳遞給命令的方式。所以,試試這個:

String[] command = { ffmpegLoc+"ffmpeg.exe", 
        "-i", dir+params.getString(4)+".flv", 
        "-copyts", 
        "-crf", "18", 
        "-profile:v", "baseline", 
        "-level", "3.0", 
        "-pix_fmt", "yuv420p", 
        "-preset", "veryslow", 
        dir+params.getString(4)+".mp4"};