2014-09-19 63 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"};