Java在Linux中不运行命令

Java在Linux中不运行命令,linux,command-line,ffmpeg,java,Linux,Command Line,Ffmpeg,Java,在java代码中执行此ffmpeg命令时遇到问题: 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

在java代码中执行此
ffmpeg
命令时遇到问题:

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
我使用以下命令:

String command= "ffmpeg -i "+dir+"sample.mp4 -i "+dir+"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";
final ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", command);
System.out.println(command);
final Process p = pb.start();
我只是删除了
。但仍然没有机会

我还使用了
getRuntime()
方法,但这对我也不起作用

String c1=" -i "+dir+"sample.mp4 "+"-i "+dir+"ad.mp4 -fi‌​lter_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] "+dir+"output.‌​mp4";
RunCommand("ffmpeg"+c1);
使用此方法:

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

        // Get output stream to write from it
        // Read the output

        BufferedReader reader =  
                new BufferedReader(new InputStreamReader(proc.getInputStream()));
        String line = "";
        while((line = reader.readLine()) != null) {
            System.out.print(line + "\n");
            //              System.out.println(ads.get(0));
        }
        proc.waitFor();  

    } catch (IOException e) {
    }
}
此选项也不起作用,打印退出值会显示以下内容:

Exception in thread "main" java.lang.IllegalThreadStateException: process hasn't exited
    at java.lang.UNIXProcess.exitValue(UNIXProcess.java:423)
    at parser.Parser.RunCommand(Parser.java:106)
    at parser.Parser.commandGenerator2(Parser.java:79)
    at parser.Parser.main(Parser.java:44)
如果在打印退出值之前移动
proc.waitFor();
,则它是
1


问题是什么?为什么它不在Java代码中运行?

由于参数复杂,使用
Runtime.exec()
可能会更容易运行。为什么要使用/bin/sh?您可以直接运行
ffmpeg
,并使用ProcessBuilder构造函数避免shell解析命令参数:
new ProcessBuilder(“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],[out],“output.xenompt=4”不调用我的启动代码(
什么都没有发生。@Kayaman使用
运行时
对我没有任何帮助。好吧,也许你需要了解一下如何使用
ProcessBuilder
。到目前为止,你说的是“它没用”,没有任何解释。“对我没有任何帮助。”“不是描述您遇到什么问题的方法。由于参数复杂,使用
Runtime.exec()
可能会更容易运行。为什么要使用/bin/sh?您可以直接运行
ffmpeg
,并使用ProcessBuilder构造函数来避免shell解析命令参数:
new ProcessBuilder(“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-STARTPTS[v2];[v0][v2]concat=n=3:v=1:a=0[out],“-map”,[out],“output.mp4”
什么都没有发生。@Kayaman使用
运行时
对我没有任何帮助。好吧,也许你需要阅读一下如何使用
ProcessBuilder
。到目前为止,你说的是“它没用”,没有任何解释。“不为我做任何事情”不是描述你遇到什么问题的一种方式。