【问题标题】:How does the ProcessBuilder constructor parameter work?ProcessBuilder 构造函数参数如何工作?
【发布时间】:2014-09-20 04:59:13
【问题描述】:

我正在这样做:

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'.

所以我们到达了遇到第一个空格的地方,然后失败了。

【问题讨论】:

    标签: java ffmpeg


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-23
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-26
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多