4

私は Java をまったく初めて使用するということから始めましょう。私は PHP のバックグラウンドを持っていますが、たまたま PHP タスクの 1 つを Java に変換する必要があります。

このタスクは、ffmpeg を使用してビデオをフレームに分割し、それらのフレームで作業することです。PHPでこのプロセスを完了しました。そして今、私はそれをJavaに変換することができます.

私はいくつかのチュートリアルを調べて、基礎をカバーしました (IDE の使用、Java プログラムの実行など)。この目的のためにEclipseを使用しています。

私はこれまで、Javaプログラムを使用してffmpegを起動することができました

public static void main(String[] args) throws IOException {

    String livestream = "D:/video.mpg";
    String folderpth = "D:/frames";
    String cmd="D:/ffmpeg/bin/ffmpeg.exe -i "+ livestream +" -r 10 "+folderpth+"/image%d.jpg";

    //System.out.println(cmd);
    Runtime r = Runtime.getRuntime();
    Process p = r.exec(cmd); // this starts creating frames
   // and stores them on local disk
   // any way to store that frame name in array?
   // something like String[] frames = {"image%d.jpg"}
   // so that frames array contains image1.jpg, image2.jpg..and so on?

}

これは正常に機能しています。フォルダーにフレームを取得しています。ビデオの長さが2時間以上で、タスクバーに移動してプロセスを手動で強制終了する必要がないため、5分後にプロセスを強制終了します。また、ffmpeg によって作成されたフレーム名を将来使用するために配列に格納する方法があるかどうかも知りたいです。

使用してみp.destroy()ましたが、プロセスはまったく停止しませんでした。setTimeout()jQueryで使用されているようなものを使用するにはどうすればよいですか?

一部のメタデータ

OS:Windows7

IDE: エクリプス

4

3 に答える 3

3

p.destroy()kill PIDLinuxで送信します。これは、プロセスがシグナルを受信して​​も、必ずしも終了しないことを意味します。kill -9 PIDプロセスが実際に終了したことを確認するために実行する必要があります。残念ながら、標準の Java API はそのような機能を提供していないため、自分で行う必要があります。

しかし、それほど複雑ではありません。killUnixkilltask用と Windows用の2 つのコマンドしかありません。どちらもプロセス ID を受け入れます。リフレクションによってそれを発見できます: プライベート int フィールドは、取得pid元のインスタンスのプラットフォーム固有のサブクラスにProcess存在しますruntime.exec()

編集

Linux では、 extendsruntime.exec()のインスタンスを返します。現在利用可能なウィンドウがなく、確認できませんが、ウィンドウで覚えている限り、インスタンスまたはそのようなものを返します。どちらにも、リフレクションを使用して抽出できるプライベート int フィールドがあります。UnixProcessProcessWindowsProcesspid

Process proc = Rutime.getRuntime().exec("my command");
Field f = proc.getClass().getDeclaredField("pid");
f.setAccessible(true);
int pid = (Integer)f.get(proc);
于 2013-02-19T07:36:49.633 に答える
0

簡単な方法は、java.util.Timerjava.util.TimerTaskを使用してタイマーを 5 分 (または任意の期間) に設定することです。タイマー タスクは、タイマーがオフになったときにそれを強制終了するプロセス ハンドルを取得します。タイマー タスクをトリガーします。

于 2013-02-19T07:34:42.660 に答える
0

Apacheウォッチドッグが役立つと思います。指定された時間、実行を待ちます。時間が指定された時間を超えると、プロセスが終了します。commons execで利用できます

サンプルコード:

ExecuteWatchdog watchdog = new ExecuteWatchdog(1000*60*5);
Process process= Runtime.getRuntime().exec("cmd");
watchdog.start(process);
于 2013-02-19T07:48:08.203 に答える