• 締切済み

javaからのFFMPEGの利用

現在、windows vista に ffmpeg をインストールし、java(1.6)から以下のようにffmpeg.exeを呼び出しています。 -------------------------------------------------------------- public static void main(String[] args) { ProcessBuilder builder = new ProcessBuilder("C:/Tools/3GP_Converter034/cores/debug.bat"); try { Process process = builder.start(); InputStream is = process.getInputStream(); //標準出力 printInputStream(is); InputStream es = process.getErrorStream(); //標準エラー printInputStream(es); } catch (Exception e) { throw new ConversionException(e); } } public static void printInputStream(InputStream is) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(is)); for (;;) { String line = br.readLine(); if (line == null) break; System.out.println(line); } } -------------------------------------------------------------- debug.batの中身は以下です。 -------------------------------------------------------------- C:/Tools/3GP_Converter034/cores/ffmpeg.exe -y -i c:/work/a.mpg -f flv -vcodec flv -r 25 -b 900k -ar 44100 -ab 64k c:/work/out99.flv -------------------------------------------------------------- debug.batを直接呼び出すと正常にout99.flvが出力されるのですが、java経由だとうまくできません。 printInputStreamメソッドから以下のsysytem out文が出力されたまま止まってしまいます。 C:\java>C:/Tools/3GP_Converter034/cores/ffmpeg.exe -y -i c:/work/a.mpg -f flv -vcodec flv -r 25 -b 900k -ar 44100 -ab 64k c:/work/out99.flv まったく理由がわかりませn。 どなたかご教示ください;;

みんなの回答

回答No.2

う~ん。 標準出力と標準エラーの出力をコメントアウトしてみて、 代わりに process.waitFor(); int result = process.exitValue(); System.out.println("result:"+result); としてみるとどうなりますか? 正常に実行できていれば、resultが0になると思うのですが…。

MACKA
質問者

補足

ご回答ありがとうございます。 ご提示いただいた通りのコードを実行したところ、 process.waitFor()以降に処理が進まない状態となります。 やはりffmpegコマンドが実行されていないように思えます・・

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

Windows VistaなのでUACが利いてるとか…。 ffmpegの実行に管理者権限が必要とかありませんか?

MACKA
質問者

補足

ご回答ありがとうございます。 vista全体で、UACは無効に設定しています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • javaからffmpegの利用

    ffmpegを呼び出してmp3変換を行いたいのですがずっと動いたまま終了せずに困っています。 import java.io.IOException; public class Cratemp3 { public static void main(String[] args) throws IOException, InterruptedException { ProcessBuilder processBuilder = new ProcessBuilder( "./ffmpeg", "-y" , "-i" , "sample.flv", "-acodec" , "copy" , "sample.mp3" ); Process process = processBuilder.start(); process.waitFor(); } } process.waitFor()を抜くと上手く動きますが process.waitFor()をいれると上手く動きません。 ffmpegで変換したmp3ファイルを使用して処理を続けたいのですがどうしたらいいのでしょうか? よろしくお願いします。

  • 助けてください!!

    flvファイルをmp3ファイルに変換するバッチファイルを作りたいんですけど、全くわかりません! どなたかご教授していただけませんか? コマンドプロントで入力するコマンドは以下になります。 D:\ProgramFile\music_convert\3GP_Converter034\cores>ffmpeg -i "c:\out.flv" -ab 128 out.mp3 よろしくお願いいたします!!!

  • macOSX10.3.9でflv形式からmp3に変換したいのですが、困っています

    flv形式からmp3に変換したいのですが、よい解決方法がみつかりません。 初心者のようなものなので自分で調べましたがわかりませんでした。 環境はmacOSX(10.3.9)です。 以下の説明は「携帯動画変換ちゃん」をダウンロードして 行き詰まったところまでの説明ですが、 別に「携帯動画変換ちゃん」の解決でなくても結構です。 他の方法があれば、それでもいいので教えて下さい。 ■■■■■■■■■■■■■■■■■■■■■■■■ とりあえず「携帯動画変換ちゃん」をダウンロードしてみましたが、 ダウンロードした「3GP_Converter」の中に説明のある、 「cores」フォルダがありません。 「3GP_Converterフォルダ」内に現在、 「0 更新内容/1 はじめに/2 インストール.rtfd/ 3 使い方/ESDSChanger(フォルダ)/fixtitle/ お助けインストーラ/携帯動画変換ちゃん」があります。 『3)「fixtitle」を「3GP_Converter034」フォルダの中の 「cores」フォルダにコピーする。』というのと 『5)「ffmpeg」を「3GP_Converter034」フォルダの中の 「cores」フォルダにコピーする。』というのが、 フォルダ内にないのでわかりません。 ■■■■■■■■■■■■■■■■■■■■■■■ どんな方法でもとりあえず「ffmpeg」っていうのがいるのかな? とアバウトにわかったような感じがしますが、 ffmpegのダウンロードページに行っても どうしたらいいのかわからなくて。。 本当に拙い説明で申し訳ありませんが、 猿でもわかるようにflv→mp3(OS10.3)を教えて頂けますと泣いて喜びます!

  • java わからない。

    今、卒業研究でJAVAを扱っています。 しかし、思った動作をするプログラムが作れません。 時間もなくなってきたので、okwaveに投稿しました。 お願いします。 パソコンはwindowsです。 プログラムを実行すると, (1)コマンドプロセッサでdirを実行してくれる。 (2)実行した後にファイルにする。 実行するときは[dir > dir.txt]のようにしたいです。 今まで書いてきた例をいかに描きます。 import java.io.*; public class TestExec1 { public static void main(String[] args) { try { String s1 = "dir"; Process process = Runtime.getRuntime().exec(s1); InputStream is = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } } } どこが間違っているかわかりません。 よろしくお願いします。

  • javaからexeの起動、値渡し(?)について。

    1. 短縮したソースで申し訳ないのですが、JavaからC++で作成したexeファイルの、 int secに、javaでexe起動時に任意の数値を渡したいのですが、 何か良い方法はありますでしょうか? 2. またJavaで、外部ファイルを起動した時に、例えばFirefox等の場合、 自身の設定や、お気に入りが全くない状態で起動するのは何故でしょうか? 回答いただければと思います。どうぞよろしくお願いいたします。 [java] ProcessBuilder pb=new ProcessBuilder("C:\\Users\\Super\\Desktop\\cplus.exe", "30"); try { Process p=pb.start(); int ret=p.waitFor(); System.out.println("process exited with value : " + ret); } catch (IOException ioe) { } catch (InterruptedException inte) { } [C++ win32api] #include <windows.h> int main() { int sec=0; HANDLE hTimer; BOOL ret=FALSE; DWORD err=0; //以下はタイマー作成 }

    • ベストアンサー
    • Java
  • javaのsocket通信で20KB以上の文字列を

    javaのsocketについての質問です。サーバーとandroid端末で文字列のやりとりしています。 文字列は長いので、圧縮をかけ、android端末側で解凍を行っています。 そこで問題がおきました。文字データ量(20KB)が大きくなると、通信が完了せずに途中で止まってしまうのです。そこで文字列を分割(1KB毎)して送るなどを行い、しのいでおりましたが根本的の解決にはいたっていません。 InputStreamReader 、 BuffererdReader あたりを考えればいいと思うのですが、いまいち組み方がよくわからない状態です。 どなたか教えていただけないでしょうか? ============================= サーバー(PC側ソースコード)DataCompression は文字列を送って圧縮をかける独自のクラスです。 public class DataExchange extends Thread{ /* android端末とデータのやり取りをする */ private boolean DEBUG_FLAG = true; // private boolean DEBUG_FLAG = false; private InputStream is; private OutputStream os; private String sendStr; private String receiveStr; public DataExchange(InputStream is, OutputStream os, String sendStr) { this.is = is; this.os = os; this.sendStr = sendStr; } public void run() { //送信データ圧縮 DataCompression dc = new DataCompression(); byte[] sendByte = dc.getDataCompression(sendStr); //データ送信 try { os.write(sendByte); os.flush(); } catch (IOException e) { e.printStackTrace(); } if (DEBUG_FLAG) { System.out.println(os + " データ送信完了 = " + sendStr); } //データ受け取り byte[] buffer = new byte[1024]; try { int size = 0; while (size <= 0) { size = is.read(buffer); } receiveStr = new String(buffer, 0,size, "UTF8"); } catch (IOException e) { e.printStackTrace(); } if (DEBUG_FLAG) { System.out.println(is + " データ受信完了 = " + receiveStr); } } public String getReceiveStr() { return receiveStr; } } ========================================= android端末側ソースコード public class DataExchange extends Thread{ /* android端末とデータのやり取りをする */ private InputStream is; private OutputStream os; private String sendStr; private String receiveStr; public DataExchange(InputStream is, OutputStream os, String sendStr) { this.is = is; this.os = os; this.sendStr = sendStr; } public void run() { //データ受け取り byte[] buffer = new byte[4096]; try { int size = 0; while (size <= 0) { size = is.read(buffer); } receiveStr = new String(buffer, 0,size, "UTF8"); } catch (IOException e) { e.printStackTrace(); } /* 解凍 */ Inflater decompresser = new Inflater(); decompresser.setInput(buffer); int count; ByteArrayOutputStream decompos = new ByteArrayOutputStream(); while (!decompresser.finished()) { try { count = decompresser.inflate(buffer); decompos.write(buffer, 0, count); } catch (DataFormatException e) { e.printStackTrace(); } } receiveStr = decompos.toString(); System.out.println("データ受信完了 = " + receiveStr); //データ送信 try { byte[] sendByte = sendStr.getBytes("UTF8"); os.write(sendByte); os.flush(); } catch (IOException e) { e.printStackTrace(); } System.out.println("データ送信完了 = " + sendStr); } public String getReceiveStr() { return receiveStr; } }

    • ベストアンサー
    • Java
  • javaにおけるサブプロセスの待ち方

    以下のコードで問題が起きました。 javaからサブプロセスを読んで、サブプロセスの標準出力から 文字列を取得するプログラムです。 //Inter.java import java.io.*; public class Inter { static final int A = 10; public static void main(String[] arg) { String out = "Initial"; int c; Runtime rt = Runtime.getRuntime(); try{ Process ps = rt.exec("process.exe"); BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream())); System.out.println("Debug:OK"); for(c=0;c < A;c++)//ポイント1 { out = br.readLine(); System.out.println("java:" + out); } out = Integer.toString(ps.waitFor());//ポイント2 System.out.println("終了コード:" + out); }catch(Exception ex){ System.out.println("エラー"); } System.out.println("正常終了"); } } 一方呼び出されるサブプロセスは //process.c //compiled to process.exe #include <stdio.h> int main () { int i,k,n; for(i=0;i<100;i++) { printf("test%d\n",i); } return 235; } ここで、java側のコードの定数Aを1以上に設定るると期待どおりの結果が出るのですがA=0つまり、for文に一度も入らず、標準出力のストリームから文字列を一度も読まないとフリーズします。どうやら out = Integer.toString(ps.waitFor());//ポイント2 の部分で止まるようです。これはなぜでしょうか?これでは、標準出力があるサブプロセスの終了コードだけ知りたい時に不便ではないですか?これはもしやjava言語システムのバグではないでしょうか!waitFor()メソッドの実装が観たいのですがあいにくnativeキーワードがあるメソッドで手元のソースだけではでは中身がわかりません。nativeのさらに中の実装は見ることはできないのでしょうか?

    • ベストアンサー
    • Java
  • 日本語名でエラーになる

    InputStream is = new FileInputStream("C:\\kiku.jpg"); アルファベットのときは問題ありませんが InputStream is = new FileInputStream("C:\\菊.jpg"); このようにファイル名に日本語が入るとエラーになります。 Exception in thread "main" java.lang.RuntimeException: java.io.FileNotFoundException いろいろ調べてみたんですが、分かりません。

    • ベストアンサー
    • Java
  • SWTのStyledTextを使用したコンソールの開発

    SWTのStyledTextを使って、コマンドプロンプトのSWT版を作ろうと考えています。 具体的には、Google Androidの「adb shell logcat」の内容をSWTのStyledTextに表示したいのですが、実行するとGUIが固まってしまいます。 期待している動作は、「adb shell logcat」をStyleTextから実行後すると、一度、ログの内容が出力され、そのまま待機します。 その後、ログが出力されてるたびにStyleTextにログが追記されるというものです。 以下は該当箇所のソースです。 String command = "C:/android-sdk-windows-1.5_r1/tools/adb.exe shell logcat"; Display.getCurrent().asyncExec(new Runnable() { @Override public void run() { exec(command); } }); protected boolean exec(String command) { Process process = null; ProcessBuilder pb = new ProcessBuilder("cmd", "/C", command); try { process = pb.start(); InputStream in = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); String line; while ((line = br.readLine()) != null) { if (line.length() == 0) { line = br.readLine(); } // 次も空行なら終了 if (line.length() == 0) { break; } styledText.append(line); styledText.append("\n"); // スクロールバーを下に動かす styledText.setTopIndex(styledText.getLineCount()); } br.close(); } catch (Exception e) { e.printStackTrace(); return false; } return true; }

    • ベストアンサー
    • Java
  • どうしてもプログラムが動いてくれません....

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringWriter; public class Tese { public static void main(String[] args) throws InterruptedException, IOException { ★ ProcessBuilder pb = new ProcessBuilder("cmd", "/C", "dir", "C:\\Program Files\\Java"); ★ Process p = pb.start(); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); Catcher c = new Catcher(br); c.start(); p.waitFor(); p.destroy(); System.out.println(c.out.toString()); } } class Catcher extends Thread { Reader in; StringWriter out = new StringWriter(); public Catcher(Reader in) { this.in = in; } public void run() { int c; try { while ((c = in.read()) != -1) { out.write((char)c); } } catch (IOException e) { e.printStackTrace(); } } ★で囲んでいる部分なのですが,コンパイルすると Exception in thread "main" java.lang.Error: コンパイル問題が未解決です。 コンストラクター ProcessBuilder(String, String, String, String) は未定義です。 at Tese.main(Tese.java:10) というエラーが出ます. どうすればエラーが消えるかわかる方いらっしゃったら,ぜひ助言頂けないでしょうか・へj

    • ベストアンサー
    • Java