我需要用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进程不会关闭(还有资源没释放)谢谢大家帮我出出主意
目前想到的就是用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进程不会关闭(还有资源没释放)谢谢大家帮我出出主意
应该可以把.
不过我用多线程没能解决...- -!一直没想通,为什么启动后的别的进程和java进程间还有联系...
java.lang.Runtime.getRuntime().exec("cmd.exe /c start ffmpeg ......");这样不行吗
用同样的方式调用一个dos命令 比如拷贝文件等
看看会不会出现同样的问题
可以运行copy等命令,没问题..改用ffmpeg并不是执行不了,ffmpeg这个程序是启动了的,并且还转成了几十K(但每次长度不定),然后就卡那里了,直到关闭调用它的java进程,它才能继续...
谢谢你提供这么一个思路,可是我用unlocker检查被转换的文件,这个文件只有ffmpeg占用着它
而ffmpeg没任何东西占用(也就是说和java进程是没直接联系的)不仅仅是jFrame会出现,哪怕只是命令行,只要java进程没停止就无法转换
需要读取ffmpeg输出的错误流(为什么会是这个,难怪我读输入流没反应...- -!)
就可以了,不然会在错误流那里阻塞,除非主进程(启动ffmpeg的java进程)结束,否则一直阻塞...