0

我正在从 Java 运行 ffmpeg。使用它将flv文件转换为mp3。

当我运行下面的代码时,ffmpeg 启动,创建一个新文件(.mp3 文件)但以 0% 的 CPU 运行。当我停止 JAVA 应用程序(来自 netbeans)时,ffmpeg 保持打开状态,并且每个 Windows 任务管理器(CTRL-ALT-DEL)从 0% 变为 99%。另一件奇怪的事情正在发生。ffmpeg 的输出没有被打印。

线程正在启​​动,但由于某种原因,java 没有给它任何时间来进行处理。

对于如何解决这个问题,有任何的建议吗?谢谢。

public class ConverterThread extends Thread {

 String fileToConvert;
 String fileToCreate;
 GetSong getSong;



public ConverterThread(String downloadLocationOnDisk, GetSong getSong) {
   this.fileToConvert = downloadLocationOnDisk;
   this.getSong = getSong;
}


public void run(){
    try {
        Thread cur=Thread.currentThread();
        cur.setPriority(Thread.MAX_PRIORITY);

           String downloadLocationOnDisk = fileToConvert;

            if(downloadLocationOnDisk.contains(".flv"))
                fileToCreate = downloadLocationOnDisk.replace(".flv", ".mp3");

            if(downloadLocationOnDisk.contains(".m4a"))
                fileToCreate = downloadLocationOnDisk.replace(".m4a", ".mp3");



            String cmdLine =  "ffmpeg/bin/ffmpeg -i \"" + fileToConvert + "\" \"" + fileToCreate +"\""; 

            System.err.println(cmdLine);

             // run the Unix "ps -ef" command
             // using the Runtime exec method:
             Process p = Runtime.getRuntime().exec(cmdLine);


             BufferedReader stdInput = new BufferedReader(new 
                  InputStreamReader(p.getInputStream()));

             BufferedReader stdError = new BufferedReader(new 
                  InputStreamReader(p.getErrorStream()));

             String s;

             // read the output from the command
             while ((s = stdInput.readLine()) != null) {
                 System.out.println(s);
             }

             // read any errors from the attempted command
             System.out.println("Here is the standard error of the command (if any):\n");
             while ((s = stdError.readLine()) != null) {
                 System.out.println(s);
             }

    } catch (IOException ex) {
        Logger.getLogger(ConverterThread.class.getName()).log(Level.SEVERE, null, ex);
    }
4

2 回答 2

1

我找到了解决方案。见这里http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=2

于 2012-08-02T20:27:18.677 回答
0

我认为这个问题出在某个地方:

Thread cur=Thread.currentThread();
cur.setPriority(Thread.MAX_PRIORITY);

您的 Java 环境具有最高优先级,并且没有给 ffmpeg 足够的 CPU 时间。事实上,考虑完全不使用线程优先级,因为它可能导致不同操作系统/环境中的不同行为。

您也在此处等待 ffmpeg 命令结束:

while ((s = stdInput.readLine()) != null) {
    System.out.println(s);
}

因此,您将在这里等到 ffmpeg 完成,如果 java 有所有 cpu 时间,这很难。

于 2012-08-02T18:06:58.390 回答