Java ProcessBuilder构造函数参数是如何工作的?

Java ProcessBuilder构造函数参数是如何工作的?,java,ffmpeg,Java,Ffmpeg,我正在这样做: String[] command = {ffmpegLoc+"ffmpeg.exe", "-i ", "\""+dir+params.getString(4)+".flv"+"\"", "-copyts", "-crf 18", "-profile:v baseline", "-level 3.0", "-pix_

我正在这样做:

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
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
之前,那个连字符发生了什么事

包装.flv文件路径的双引号怎么了

这是怎么回事

编辑:

根据答案,我删除了转义的双引号,现在我得到:

Unrecognized option 'i C:/Program'.
Error splitting the argument list: Option not found
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'.

因此,我们遇到了第一个空格,但失败了。

当您创建字符串数组时,您假设如果在命令行执行,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"};