关于调用外部程序的问题,需要大家帮忙

runshine 2008-05-11 06:51:32
我需要用java进行视频格式的转换
目前想到的就是用ProcessBuilder和Process来调用ffmpeg这个exe文件,由它来转换

但是却遇到这么一个问题,如果我的java程序未能结束,ffmpeg就不工作
这时从资源管理器内可以看到ffmpeg已经启动

如果我把调用这个ffmpeg进程的java程序结束,ffmpeg才会开始工作

举个例子:

import java.io.*;
import java.util.*;

public class test
{
public static java.lang.Process pr;

public void convertVideo()
{
try
{

List<String> commend=new java.util.ArrayList<String>();
commend.add("ffmpeg");
commend.add("-i");
commend.add("c:\\xxx.avi"); //需要被转换的文件路径
commend.add("-ab");
commend.add("64");
commend.add("-ar");
commend.add("22050");
commend.add("-b");
commend.add("500");
commend.add("-r");
commend.add("24");
commend.add("-s");
commend.add("320x240");
commend.add("c:\\yyy.flv"); //转换后的文件输出路径及格式

ProcessBuilder builder = new ProcessBuilder();
builder.command(commend);
pr=builder.start();

} catch(Exception e){e.printStackTrace();}
}
public static void main(String[] args)
{


new test().convertVideo();

BufferedReader streami = new BufferedReader(new InputStreamReader(System.in));
try
{
streami.readLine(); //举的例子,故意在这里阻塞,换成其他不让java程序结束的方式也是一样
} catch(Exception e){e.printStackTrace();}


}
}



向上面那样的话,在资源管理器里ffmpeg是已经启动了的,但却没运行
去c盘也能看到转换了一点的文件(一般只有几十K,不确定)
java程序会等待你的输入,你随便输入什么或者强制结束java进程也行,ffmpeg才会继续转换下去
放两个线程里去执行也是一样.

该怎么解决呢?
实际中我用的是一个JFrame主程序调用的,所以不能走结束java进程而使ffmpeg运行这条路

并且如果这时用JFrame.dispose()来关闭会看到java进程不会关闭(还有资源没释放)

谢谢大家帮我出出主意
...全文
128 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
大海Online 2008-05-12
  • 打赏
  • 举报
回复
既然ffmpeg已经运行一段时间了,说明启动是没有问题的

如果不使用jFrame可以正常运行,而使用jFrame会卡在某个地方的话,那可能就是因jFrame占用了ffmpeg的某个资源

从你的调用过程来看,可能是jFrame打开了c:\\xxx.avi这个方件,未释放

从常见的转换程序来看,一般都是先让用户选择某个文件,然后再执行转换,请检查你的程序是否打开了这个那个文件,而没有正常关闭,从而导致转换程序打不开那个待转换的文件,而当你的java程序关闭时,资源释放后,才能使ffmpeg读取文件,然后再转换

总之一句话,请检查待转换的文件是否被jFrame打开,而没有正常关闭
runshine 2008-05-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 seavers 的回复:]
既然ffmpeg已经运行一段时间了,说明启动是没有问题的

如果不使用jFrame可以正常运行,而使用jFrame会卡在某个地方的话,那可能就是因jFrame占用了ffmpeg的某个资源

从你的调用过程来看,可能是jFrame打开了c:\\xxx.avi这个方件,未释放

从常见的转换程序来看,一般都是先让用户选择某个文件,然后再执行转换,请检查你的程序是否打开了这个那个文件,而没有正常关闭,从而导致转换程序打不开那个待转换的文件,而当你的java程序…
[/Quote]

谢谢你提供这么一个思路,可是我用unlocker检查被转换的文件,这个文件只有ffmpeg占用着它
而ffmpeg没任何东西占用(也就是说和java进程是没直接联系的)

不仅仅是jFrame会出现,哪怕只是命令行,只要java进程没停止就无法转换
runshine 2008-05-12
  • 打赏
  • 举报
回复
好了,问题终于在偶然间解决了
需要读取ffmpeg输出的错误流(为什么会是这个,难怪我读输入流没反应...- -!)
就可以了,不然会在错误流那里阻塞,除非主进程(启动ffmpeg的java进程)结束,否则一直阻塞...
shenshan 2008-05-11
  • 打赏
  • 举报
回复
期待中
runshine 2008-05-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dracularking 的回复:]
先确定是不是你这种使用方式的问题
用同样的方式调用一个dos命令 比如拷贝文件等
看看会不会出现同样的问题
[/Quote]

可以运行copy等命令,没问题..

改用ffmpeg并不是执行不了,ffmpeg这个程序是启动了的,并且还转成了几十K(但每次长度不定),然后就卡那里了,直到关闭调用它的java进程,它才能继续...
dracularking 2008-05-11
  • 打赏
  • 举报
回复
先确定是不是你这种使用方式的问题
用同样的方式调用一个dos命令 比如拷贝文件等
看看会不会出现同样的问题
runshine 2008-05-11
  • 打赏
  • 举报
回复
回楼上,不行..
hmsuccess 2008-05-11
  • 打赏
  • 举报
回复

java.lang.Runtime.getRuntime().exec("cmd.exe /c start ffmpeg ......");

这样不行吗
dracularking 2008-05-11
  • 打赏
  • 举报
回复
用Runtime的exec方法来执行呢
runshine 2008-05-11
  • 打赏
  • 举报
回复
谢谢楼上
不过我用多线程没能解决...- -!

一直没想通,为什么启动后的别的进程和java进程间还有联系...
Shine_Panda 2008-05-11
  • 打赏
  • 举报
回复
启动一个单独的线程来 调用ffmpeg 并处理不行吗?
应该可以把.

62,615

社区成员

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

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