gpt4 book ai didi

java - 重复调用终端命令的最佳方式

转载 作者:行者123 更新时间:2023-11-29 09:06:15 24 4
gpt4 key购买 nike

我正在使用 mencoder 来拆分文件,我想将其转换为面向对象的方法,如果可能的话,例如使用 Java 或类似的方法。但我不确定最好的方法,所以我把它留在了开放的地方。这是我需要的:

我有一个包含开始时间和结束时间的 excel 文件,我需要从视频文件中提取适当的剪辑。在终端(我在 Mac OS X 上)我已经成功使用,例如:

mencoder -ss 0 -endpos 10 MyVideo.avi -oac copy -ovc copy -o Output.avi

它通过剪辑视频 MyVideo.avi 的前 10 秒来创建视频 Output.avi。

但是,就像我说的,我想让程序从 excel 文件中读入,并针对每个开始时间和结束时间多次调用此 mencoder 命令(超过 100 次)。

我知道如何用 Java 读取 excel 文件,但我不确定最好从 Java 调用此命令。另外,我希望能够看到 mencoder 的输出(因为它打印出一个很好的百分比,所以您知道单个命令将花费多长时间)。这种事情在 shell 脚本中可行吗?如果可能的话,我真的想使用 Java,因为我有多年的 Java 经验,但没有 shell 脚本编写经验。


更新

这是我在 Java 中尝试过的方法,但它在 in.readLine()

处卡住
        File wd = new File("/bin");
System.out.println(wd);
Process proc = null;
try {
proc = Runtime.getRuntime().exec("/bin/bash", null, wd);
}
catch (IOException e) {
e.printStackTrace();
}
if (proc != null) {
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
out.println("cd ..");
out.println("pwd");
String video = "/Users/MyFolder/MyFile.avi";
String output = "/Users/MyFolder/output.avi";
int start = 0;
int end = 6;
String cmd = "mencoder -ss " + start +
" -endpos " + end +
" " + video + " -oac copy -ovc copy -o " + output;

out.println(cmd);
try {
String line;
System.out.println("top");
while ((line = in.readLine()) != null) {

System.out.println(line);
}
System.out.println("end");
proc.waitFor();
in.close();
out.close();
proc.destroy();
}
catch (Exception e) {
e.printStackTrace();
}
}

最佳答案

我不太确定 mencoder 的多核功能,但我认为对于 Java,您可以使用多线程来获得所有 cpu 核心的最大功率。

您不应该像使用它那样使用 Runtime。

使用运行时时,您不应像在终端上键入命令时那样运行 bash 并通过输入流发送命令。

Runtime.getRuntime().exec("mencoder -ss " + start + " -endpos " + end + " " + video + " -oac copy -ovc copy -o " + output);

要获取输出,您可以使用 inputStream

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String,%20java.lang.String[],%20java.io.File%29

使用此命令,您还可以设置执行命令的工作目录。

我也更喜欢以 String[] 作为参数的版本。它比串联的字符串更具可读性。

关于java - 重复调用终端命令的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14915290/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com