2

私はmencoderファイルを分割するために使用していますが、可能であれば、たとえばJavaなどを使用して、これをオブジェクト指向のアプローチに変えたいと思います。しかし、最善の方法がわからないので、私はそれをオープンのままにしておきます。これが私が必要とするものです:

開始時刻と終了時刻が記載されたExcelファイルがあり、ビデオファイルから適切なクリップを抽出する必要があります。ターミナル(私はMac OS Xを使用しています)では、たとえば次のコマンドを使用して成功しました。

mencoder -ss 0 -endpos 10 MyVideo.avi -oac copy -ovc copy -o Output.avi

これは、ビデオMyVideo.aviの最初の10秒間をクリップすることにより、ビデオOutput.aviを作成します。

しかし、私が言ったように、プログラムがExcelファイルから読み込み、このmencoderコマンドを開始時間と終了時間ごとに複数回(100回以上)呼び出すようにしたいと思います。

JavaでExcelファイルを読み取る方法は知っていますが、Javaからこのコマンドを呼び出すのが最適かどうかはわかりません。さらに、の出力を確認できるようにしたいと思いますmencoder(1つのコマンドにかかる時間がわかるように、適切なパーセンテージが出力されるため)。この種のことはシェルスクリプトで実行可能ですか?私はreallyJavaで長年の経験があり、シェルスクリプトの経験がないので、可能であればJavaを使用したいと思います。


アップデート

これが私がJavaで試したことですが、in.readLine()

        File wd = new File("/bin");
        System.out.println(wd);
        Process proc = null;
        try {
           proc = Runtime.getRuntime().exec("/bin/bash", null, wd);
        }
        catch (IOException e) {
           e.printStackTrace();
        }
        if (proc != null) {
           BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
           PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
           out.println("cd ..");
           out.println("pwd");
           String video = "/Users/MyFolder/MyFile.avi";
           String output = "/Users/MyFolder/output.avi";
           int start = 0;
           int end = 6;
           String cmd = "mencoder -ss " + start + 
                          " -endpos " + end + 
                          " " + video + " -oac copy -ovc copy -o " + output;

           out.println(cmd);
           try {
              String line;
              System.out.println("top");
              while ((line = in.readLine()) != null) {

                 System.out.println(line);
              }
              System.out.println("end");
              proc.waitFor();
              in.close();
              out.close();
              proc.destroy();
           }
           catch (Exception e) {
              e.printStackTrace();
           }
        }
4

1 に答える 1

0

メンコーダーのマルチコア機能についてはよくわかりませんが、Javaを使用すると、複数のスレッドを使用してすべてのCPUコアの最大の能力を得ることができると思います。

ランタイムを使用するのと同じように使用しないでください。

ランタイムを使用するときは、端末でコマンドを入力するときのように、bashを実行してinputstream経由でコマンドを送信しないでください。

Runtime.getRuntime()。exec( "mencoder -ss" + start + "-endpos" + end + "" + video + "-oac copy -ovc copy -o" + output);

出力を取得するには、inputStreamを使用できます

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String,%20java.lang.String[],%20java.io。ファイル%29

このコマンドを使用して、コマンドが実行される作業ディレクトリを設定することもできます。

また、パラメーターとしてString[]を使用するバージョンも好みます。連結された文字列よりもはるかに読みやすくなっています。

于 2013-02-16T21:35:26.847 に答える