2012-03-26 20 views
5

したがって、.flvファイルを他の形式に変換するプログラムを作成しています。 私はffmpegを使用しています.ffmpegは、コマンドラインで実行すると完全にその仕事をします。例:外部コマンドが完全に実行されない - Java

ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3 

この例は、魔法のように機能します。コマンドを実行すると、1つの問題はありません。

しかし、私はJavaクラス内から同じコマンドを実行しようとすると問題が発生します。私はtry-catchブロックでこれを行います:

System.out.println("Start"); 
Process p = Runtime.getRuntime().exec("cmd /c ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3"); 
System.out.println("End"); 

コンソールは「スタート」を表示します。変換を開始して終了しません。
誰かが私を助けることができますか?

+0

「終了」も印刷されますか? – Nerdtron

+0

C:\ testの\ tはC: estとして渡されます。ところで...バックスラッシュをエスケープする必要があります。 –

+0

'ffmpeg'は' DOS'コマンドではありません。これはコマンドラインプログラムです。 –

答えて

5

まあ、問題は非常に予期しない方法で解決されました。私は実行が生成する出力を読みとるだけでした。それで、ファイルが変換されました。

InputStream in = p.getErrorStream(); 
int c; 
while ((c = in.read()) != -1) 
{ 
    System.out.print((char)c); 
} 
in.close(); 
3

2つの問題:

  1. cmd /c ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3コマンドではありません。 (おそらくIOExceptionになり、"End"が表示されなくなります)。

    cmdは実行するコマンドで、残りの文字列は引数です。 ProcessBuilderまたはRuntime.exec(String[] cmdarray)

  2. 処理が完了するまで待つ必要があります。プロセスを開始した後、

    p.waitFor(); 
    

    を呼び出してください。以下は、Process.waitForのドキュメントへのリンクです。

+0

あなたは正しいですが、私は何かが他の場所ではうんざりかもしれないと思っています。現在のところ、プログラム*はプロセスを待つべきではないので、 'End'はコンソールにすぐに表示されるべきです –

0

、あなたがコントロール文字列をしようとしたようなものがいる:

cmd "ffmpeg" -i "C:\test.flv" -acodec "libmp3lame" -y "C:\test.mp3" 

または

cmd "ffmpeg -i C:\test.flv -acodec libmp3lame -y C:\test.mp3" 
0

まず第一に、これはDOSコマンドではありませんそれは、コンソールコマンドです。 Microsoft Windowsの任意のフレーバーからのライン。

あなたはそれを行うことができます@aioobeとしてp.waitFor()を使用するか、XugglerのようなFFMPEG用のラッパーJava APIを使用することができます。使いやすく、LGPLがあります。

関連する問題