我用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
;
-
}
分享到:
相关推荐
JRE 1.4.2 JRE(Java Runtime Environment,Java运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。
Java Runtime Environment-6.0.26.exe
JRE(Java Runtime Environment)——windows Java运行环境 64bit
Java调用Linux命令 调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例, (注意:Runtime.getRuntime().exec(command)返回的是一个Process类的实例), 该实例可用于控制进程或取得进程的...
JRE1.8.0(Java Runtime Environment)——Java运行环境32bit
Java Runtime Environment 1.6.0.7 (32-bit
实现Java通过进程名称杀进程,列子中主要实现在windows操作系统中,将进程名称为java-test.exe的进程kill掉。
NULL 博文链接:https://dingherry.iteye.com/blog/1545972
java runtime environment 1.8.0_45 64bit.rar
Java Runtime For MacOS X 10.7
在java代码中调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。 linux环境中有2个dba的用户:oracle、erm 还有1个web用户:erm 在linux环境中,这三个用户都可以直接在任意目录下执行该shell...
onnx的java包,pom引入后可以试验java调用onnx文件进行cpu模型推理。 具体见https://github.com/microsoft/onnxruntime/blob/master/java/src/test/java/sample/ScoreMNIST.java 和 ...
java 执行可执行文件,Runtime.exec、ProcessBuilder、commons-exec
java runtime environment 1.8.0_45 64bit jre1.8.0_45 64bit jre-8u261
软件功能为:将 Jar 文件转换为 Exe 可执行文件。 生成的 Exe 文件在执行时,需要 JRE(Java Runtime Environment)。 2. 用法及举例 本软件在控制台下运行,格式: D:\>J2E <jarfile> /m 说明: jarfile - 指定 ...
毕业时的外文翻译原文 A Race-Aware Java Runtime
主要介绍了Java基于Runtime调用外部程序出现阻塞的解决方法,是一个非常实用的技巧,需要的朋友可以参考下
jre(Java Runtime Environment),Java运行环境64位安装包
jre(Java Runtime Environment),Java运行环境32位安装包
Installation notes for the J2SE Runtime Environment 5.0 (JRE), including system requirements and installation instructions, are available for the following platforms. Platform 32-bit Installation 64...