Tin*_*a J 10 java linux terminal video ffmpeg
我ffmpeg在java代码中执行此命令时遇到问题:
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
Run Code Online (Sandbox Code Playgroud)
我使用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);
Run Code Online (Sandbox Code Playgroud)
使用此方法:
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) {
}
}
Run Code Online (Sandbox Code Playgroud)
这个也不起作用,打印退出值显示如下:
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)
Run Code Online (Sandbox Code Playgroud)
如果我proc.waitFor(); 在打印退出值之前移动它,它就是1.
问题是什么?为什么它不能在Java代码中运行?
war*_*gre 10
您的代码存在一些问题,首先,使用线程将内部进程流入和错误到控制台
创建一个管道流类,如:
class PipeStream extends Thread {
InputStream is;
OutputStream os;
public PipeStream(InputStream is, OutputStream os) {
this.is = is;
this.os = os;
}
public void run() {
byte[] buffer=new byte[1024];
int len;
try {
while ((len=is.read(buffer))>=0){
os.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后将运行时部分调整为:
System.out.println("Launching command: "+command);
ProcessBuilder pb = new ProcessBuilder("/bin/sh", "-c", command);
Process proc=pb.start();
PipeStream out=new PipeStream(proc.getInputStream(), System.out);
PipeStream err=new PipeStream(proc.getErrorStream(), System.err);
out.start();
err.start();
proc.waitFor();
System.out.println("Exit value is: "+proc.exitValue());
Run Code Online (Sandbox Code Playgroud)
它将显示将要运行的命令,日志以及可能的错误.
您将能够复制粘贴命令以检查终端在需要时发生了什么.
编辑:这很有趣.您的代码缺少一些转义字符并且您的代码中没有可见的字符.当我复制粘贴代码行时,我看到了它们.复制粘贴代码中的以下行,它将删除错误:
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]' "+dir+"output.mp4";
Run Code Online (Sandbox Code Playgroud)