我用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`...