【急救】java.lang.process的exec方法运行ffmpeg的视频转码linux命令,为何视频只能转一部分进程就结束?

marine_chen 2006-12-01 04:01:41
runtime方法运行linux系统命令视频转码:ffmpeg -i 1.avi -ar 22050 -ab 56 -f flv -y -s 320x240 1.flv

为何只能转前面部分视频不能把视频全部转换?这个转码命令放在linux命令行里运行就可以把视频全部转换!是java进程的问题么?

我查了一些文档,说:process的waitFor方法可以等待子进程的完成。 如果已终止该子进程,此方法立即返回。 如果没有终止该子进程,进程的调用将阻塞,直到退出子进程。

可我调了很多次还是不可以,大家多帮忙参考

程序如下:


import java.io.*;
public class process{
public static void main(String args[]){
Runtime runtime = Runtime.getRuntime();
Process process =null;
String line=null;
InputStream is =null;
InputStreamReader isr=null;
BufferedReader br =null;
try
{
process =runtime.exec("ffmpeg -i 03.avi -ar 22050 -ab 56 -f flv -y -s 320x240 05.flv");
try{
process.waitFor();
}catch(Exception e){}
is = process.getInputStream();
isr=new InputStreamReader(is);
br =new BufferedReader(isr);
if(process.exitValue() == 0){
System.out.println("ok!");
}else{
System.out.println("error!");
}
is.close();
isr.close();
br.close();
}catch(IOException e )
{
System.out.println(e);
runtime.exit(1);
}
}
}
...全文
714 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
marine_chen 2006-12-01
  • 打赏
  • 举报
回复
forevermihoutao(猕猴桃) 正解 ,可以了 :))
gyscsdn 2006-12-01
  • 打赏
  • 举报
回复
用process.getErrorStream把出错信息打印出来看看?
forevermihoutao 2006-12-01
  • 打赏
  • 举报
回复
这样:

import java.util.*;
import java.io.*;
public class process
{
public static void main(String args[])
{
try
{
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("ffmpeg -i 03.avi -ar 22050 -ab 56 -f flv -y -s 320x240 05.flv");
InputStream stderr = proc.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
System.out.println("<ERROR>");
while ( (line = br.readLine()) != null)
System.out.println(line);
System.out.println("</ERROR>");
int exitVal = proc.waitFor();
System.out.println("Process exitValue: " + exitVal);
} catch (Throwable t)
{
t.printStackTrace();
}
}
}
marine_chen 2006-12-01
  • 打赏
  • 举报
回复
to:gyscsdn(geng)

其实你的程序里,关于进程的核心代码也就是这句:pr = Runtime.getRuntime().exec(cmd, env, dir);

你运行的这几句命令执行时间比较短,瞬间就可以完成,我转视频有几十M,得几分钟才能转完,我测试的时候如果转小视频1M左右的,就可以转完,就是转大文件时间长进程会出现问题,关于这块我查了文档只有说waitFor()方法可以等待进程完成,但是我加了仍然没有效果,郁闷中!
gyscsdn 2006-12-01
  • 打赏
  • 举报
回复
上面的代码没有用process.waitFor();
gyscsdn 2006-12-01
  • 打赏
  • 举报
回复
给你些代码参考:
private String doStrMask(String inString, String type, String path)
{
Common.writeLog("doStrMask - S", this.getClass());
String osName = System.getProperty("os.name");
String cmd[];
if (osName.indexOf("Windows") != -1)
{
cmd = new String[3];
cmd[0] = "cmd.exe";
cmd[1] = "/C";
String cmdString = "";
if (type.equals("e"))
cmdString = "strmask -e \"" + inString + "\"";
else if (type.equals("d"))
cmdString = "strmask -d " + inString + "";
cmd[2] = cmdString;
}
else
{
cmd = new String[2];
cmd[0] = "sh";
String cmdString = "";
if (type.equals("e"))
cmdString = "strmask.exe -e " + inString + "";
else if (type.equals("d"))
cmdString = "strmask.exe -d " + inString + "";
cmd[1] = cmdString;
}
Common.writeLog("cmd[0] = " + cmd[0], this.getClass());
Common.writeLog("cmd[1] = " + cmd[1], this.getClass());
String[] env = {};
File dir = new File(path);
Vector<String> vcOutput = null;
try
{
Process pr = null;
if (osName.indexOf("Windows") != -1)
pr = Runtime.getRuntime().exec(cmd, env, dir);
else
pr = Runtime.getRuntime().exec(path + File.separator + cmd[1]);
vcOutput = streamToVector(pr.getInputStream());

Common.writeLog("--- getInputStream.size() = " + vcOutput.size() + "---", this.getClass());
for (String s : vcOutput)
Common.writeLog("getInputStream -> " + s, this.getClass());
Vector<String> vcError = streamToVector(pr.getErrorStream());
Common.writeLog("--- getErrorStream.size() = " + vcError.size() + "---", this.getClass());
for (String s : vcError)
Common.writeLog("getErrorStream -> " + s, this.getClass());

streamToVector(pr.getErrorStream());
}
catch (IOException e)
{
Common.writeExceptionLog(e, this.getClass());
}
Common.writeLog("doStrMask - E", this.getClass());
return vcOutput.get(0);
}
tcmis 2006-12-01
  • 打赏
  • 举报
回复
学习,,帮顶..

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧