我需要用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进程不会关闭(还有资源没释放)谢谢大家帮我出出主意

解决方案 »

  1.   

    启动一个单独的线程来 调用ffmpeg 并处理不行吗?
    应该可以把.
      

  2.   

    谢谢楼上
    不过我用多线程没能解决...- -!一直没想通,为什么启动后的别的进程和java进程间还有联系...
      

  3.   


    java.lang.Runtime.getRuntime().exec("cmd.exe /c start ffmpeg ......");这样不行吗
      

  4.   

    先确定是不是你这种使用方式的问题 
    用同样的方式调用一个dos命令 比如拷贝文件等 
    看看会不会出现同样的问题
      

  5.   


    可以运行copy等命令,没问题..改用ffmpeg并不是执行不了,ffmpeg这个程序是启动了的,并且还转成了几十K(但每次长度不定),然后就卡那里了,直到关闭调用它的java进程,它才能继续...
      

  6.   

    既然ffmpeg已经运行一段时间了,说明启动是没有问题的如果不使用jFrame可以正常运行,而使用jFrame会卡在某个地方的话,那可能就是因jFrame占用了ffmpeg的某个资源从你的调用过程来看,可能是jFrame打开了c:\\xxx.avi这个方件,未释放从常见的转换程序来看,一般都是先让用户选择某个文件,然后再执行转换,请检查你的程序是否打开了这个那个文件,而没有正常关闭,从而导致转换程序打不开那个待转换的文件,而当你的java程序关闭时,资源释放后,才能使ffmpeg读取文件,然后再转换总之一句话,请检查待转换的文件是否被jFrame打开,而没有正常关闭
      

  7.   


    谢谢你提供这么一个思路,可是我用unlocker检查被转换的文件,这个文件只有ffmpeg占用着它
    而ffmpeg没任何东西占用(也就是说和java进程是没直接联系的)不仅仅是jFrame会出现,哪怕只是命令行,只要java进程没停止就无法转换
      

  8.   

    好了,问题终于在偶然间解决了
    需要读取ffmpeg输出的错误流(为什么会是这个,难怪我读输入流没反应...- -!)
    就可以了,不然会在错误流那里阻塞,除非主进程(启动ffmpeg的java进程)结束,否则一直阻塞...