代码之家  ›  专栏  ›  技术社区  ›  Mary

Java execute命令在代码中不起作用

  •  1
  • Mary  · 技术社区  · 8 年前

    我在java程序中调用java.lang.Runtime.exec(…)来运行命令(一些 FFMPEG 命令)只传递给我的函数:

        private static void RunCommand(String command) throws InterruptedException {
            try {
                // Execute command
                Process proc = Runtime.getRuntime().exec(command);
    }
    }
    

    它适用于简单的FFMPEG情况,例如 ffmpeg -i input.avi -c copy output.avi .

    但对于其中一个命令,显然它没有运行。当我在命令行中复制/粘贴精确的字符串时,我能够运行它并查看输出文件。

    ffmpeg -i "concat:/home/temp10.avi|/home/p2.avi|/home/temp15.avi" -c copy -y /home/output.avi
    

    代码如下:

    String c4="ffmpeg -i \"concat:"+dir+temp1+"|"+dir+ad+"|"+dir+temp3+"\" -c copy -y "+dir+output;
    

    怎么回事?猜猜为什么它不在代码中运行?如果 "

    1 回复  |  直到 8 年前
        1
  •  3
  •   user2404501 user2404501    8 年前

    ffmpeg -i "concat:/home/temp10.avi|/home/p2.avi|/home/temp15.avi" -c copy -y /home/output.avi
    

    由shell运行时工作。引号是shell语法的一部分,而不是ffmpeg语法的一部分。引用是必要的,因为 | 字符,如果未引用,则会导致shell构建管道。当它被引用时,它被简单地传递给ffmpeg。

    您希望用java运行时完成同样的事情 exec 执行董事 不像贝壳。它不做管道,或重定向,或引用,或 $variable execvp

    执行董事 字符,不需要引用。传递给exec以完成与上述shell命令相同的任务的字符串应该是

    ffmpeg -i concat:/home/temp10.avi|/home/p2.avi|/home/temp15.avi -c copy -y /home/output.avi
    

    ffmpeg -i "concat:/home/temp 10.avi|/home/p2.avi|/home/temp15.avi" -c copy -y /home/output.avi
    

    (区别:第一个文件名 temp 10.avi 里面有一个空间。)现在引用有两个目的:防止 | 执行董事

    -i
    concat:/home/temp
    10.avi|/home/p2.avi|/home/temp15.avi
    -c
    copy
    -y
    /home/output.avi
    

    这不是ffmpeg想要的;它需要在 -i

    Runtime.getRuntime().exec(
      new String[] {
        "ffmpeg",
        "-i",
        "concat:/home/temp 10.avi|/home/p2.avi|/home/temp15.avi",
        "-c",
        "copy",
        "-y",
        "/home/output.avi"
      }
    )
    

    下面评论中的示例如下所示

    Runtime.getRuntime().exec(
      new String[] {
        "ffmpeg",
        "-i",
        "sample.mp4",
        "-i",
        "ad.mp4",
        "-filter_complex",
        "[0:v]trim=0:15,setpts=PTS-STARTPTS[v0]; [1:v]trim=0:5,setpts=PTS-STARTPTS[v1]; [0:v]trim=20:30,setpts=PTS-STARTPTS[v2]; [v0][v1][v2]concat=n=3:v=1:a=0[out]",
        "-map",
        "[out]",
        "output.mp4"
      }
    )
    

    -filter_complex 是单个参数,因为它在命令的shell版本中引用。它没有特殊的字符 "" ""