0

私はJavaからffmpegを実行しています。flvファイルをmp3に変換するためにそれを使用します。

以下のコードを実行すると、ffmpegが起動し、新しいファイル(.mp3ファイル)が作成されますが、CPUの0%で実行されます。(netbeansから)JAVAアプリを停止すると、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時間を与えません。実際、スレッドの優先度はまったく使用しないことを検討してください。これは、OSや環境によって動作が異なる可能性があるためです。

また、ここでffmpegコマンドの終了を待っています:

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

したがって、ここではffmpegが終了するまで待機します。これは、JavaにすべてのCPU時間が含まれている場合は困難です。

于 2012-08-02T18:06:58.390 に答える