转:http://blog.csdn.net/canedy/article/details/6005153
我用java调用mencoder实施转码,但是转码过程中出现子进程阻塞,而且还是看了API才知道这个问题的。因为mencoder
的控制台输出信息很多,把缓存区所有的空间占满了,所以程序不能执行后面的程序,mencoder就只能转码28秒的视频,所以需要建立线程及时清空缓存
区。
新建一个类StreamGobble类:
package thss.jmencoder;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class StreamGobble extends Thread {
InputStream is;
String type;
StreamGobble(InputStream is, String type) {
this.is = is;
this.type = type;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null)
System.out.println(type + ">" + line);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
在main函数中调用Runtime/Process执行转码
String line = value.toString();
String[] str = line.split(" ");
String fOutput = null;
fOutput = str[3] + ".flv";
Process process = null;
try {
Runtime runtime = Runtime.getRuntime();
process = runtime .exec("mencoder -ofps 30000/1001 -vf harddup"
+ " /user/student/data/"+str[0]
+ " -ss "+str[1]+" -endpos "+str[2]+" -sws 2 -of lavf -ovc lavc -lavcopts "
+ "vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 "
+ "-nosound -srate 22050 -o /user/student/data/"+fOutput);
new StreamGobble(process.getInputStream(), "INFO").start();
new StreamGobble(process.getErrorStream(), "ERROR").start();
int status = process.waitFor();
System.out.println("Process exitValue: " + status);
} catch (Throwable t) {
t.getStackTrace();
} finally {
if (process == null)
process.destroy();
process = null;
}
分享到:
相关推荐
在Java编程中,有时我们需要与操作系统进行交互,例如调用已存在的Windows系统下的.exe可执行文件。这在处理一些特定的任务,如自动化脚本、数据分析或者其他需要借助外部工具完成的功能时非常常见。本文将深入探讨...
在Java编程中,有时我们需要在程序中调用Windows系统的命令行操作,例如执行外部程序、系统命令或者进行文件操作。Java提供了Runtime类和Process类来实现这一功能。以下是如何使用Java调用Windows命令行的详细步骤和...
在Java编程环境中,有时我们需要与操作系统进行交互,例如调用Windows系统的可执行文件或批处理文件来执行特定任务。这通常通过Java的Runtime类或ProcessBuilder类实现。这两个类允许我们构建命令行指令并执行它们,...
这个方法会阻塞当前线程直到子进程结束为止。这样可以确保我们在继续执行后续代码之前,等待记事本程序完全关闭。 #### 2.3 `p.exitValue()`方法 获取子进程的退出状态码。通常情况下,如果程序正常结束,则返回值...
在Java中执行外部可执行文件或批处理脚本是一种常见的需求,尤其是在需要调用系统级别的工具或者与操作系统进行交互时。通过Java的`Runtime`类及其提供的方法,我们可以方便地实现这一功能。本文将详细介绍如何在...
在Java编程中,有时我们可能需要执行操作系统级别的命令,例如删除文件。这通常是通过Java的`Runtime`类或`ProcessBuilder`类来实现的。这两个类提供了与操作系统交互的能力,让我们能够执行系统命令并获取其结果。...
通过以上介绍,我们不仅了解了如何在Java程序中调用Linux命令的基本原理,还学习了如何通过`Runtime.exec()`方法创建子进程以及如何控制这些子进程。这对于开发需要与操作系统交互的应用程序是非常有用的。
以上就是关于"java中调用控制台程序"的基本概念和实践方法,包括使用Runtime和ProcessBuilder执行系统命令,以及如何调用wget工具。在实际应用中,可能还需要根据具体需求进行错误处理、进程通信等更复杂的操作。...
1. **路径问题**:确保Java代码中指定的OpenOffice可执行文件路径是正确的,且Java程序具有访问该路径的权限。 2. **环境变量**:OpenOffice可能依赖于某些环境变量,如`LD_LIBRARY_PATH`,确保它们被正确设置。 3. ...
Runtime 类提供了 exec() 方法,用于指示 Java 虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的 Process 对象实例。Process 对象可以控制该子进程的执行或获取该子进程的信息。 执行DOS内部命令...
在Java编程中,有时我们需要在程序中调用操作系统的一些功能,比如执行DOS命令,这通常是通过Java的`Runtime`类和`Process`类来实现的。本文将详细讲解如何在Java中调用DOS命令以及相关的注意事项。 首先,调用DOS...
在Java编程环境中,有时我们需要执行操作系统级别的命令或者运行非Java的可执行文件,例如Windows下的.exe文件。这个过程可以通过Java的Runtime类或者ProcessBuilder类来实现。本文将深入探讨如何在Java中执行可执行...
`Runtime.getRuntime()`返回当前应用程序的`Runtime`对象,该对象的`exec()`方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的`Process`对象实例。`process.waitFor()`则是等待子进程...
当我们需要在Java程序中执行系统命令,比如运行一个批处理脚本(.bat文件)时,`Runtime`类或者其扩展类`ProcessBuilder`就派上了用场。下面我们将深入探讨如何使用`Runtime`执行bat脚本,并了解相关知识点。 1. **...
可以使用`Process`对象的`waitFor()`方法来实现这一点,它会阻塞当前线程,直到子进程终止。 6. **关闭流资源**:在完成批处理文件的输出读取后,别忘了关闭`BufferedReader`和`InputStreamReader`,以释放系统资源...
这个方法允许我们在Java程序中执行任何可执行文件或命令行脚本。例如,我们可以构造一个包含用户名、密码和目标计算机地址的RDP连接字符串,然后用`mstsc.exe`命令行参数来启动远程桌面连接。 以下是一个简单的示例...
这个过程通常被称为调用系统执行程序,或称为进程控制。在Java中,我们可以使用`Runtime`类或者`ProcessBuilder`类来实现这个功能。下面将详细解释如何通过Java调用系统执行程序,以标题和描述中的例子作为基础进行...
在Java中,我们可以使用`Runtime.getRuntime().exec()`方法或者`ProcessBuilder`类来执行系统命令。下面我们将详细介绍如何使用这两种方法实现“ping”命令。 ### 使用`Runtime.getRuntime().exec()`方法 1. **...
在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如文件操作、进程管理等。在Linux和Unix环境中,这些任务通常可以通过执行Shell命令来实现。本文将详细介绍如何在Java代码中调用Linux/...
在Java编程中,调用命令行是常见的任务之一,它允许开发者执行系统级别的操作,如运行外部程序、管理系统资源或进行文件操作。本篇将详细讲解如何在Java中调用命令行,以及相关的知识点。 首先,Java通过`Runtime`...