2017-05-07 18 views
0

私は基本的にビデオを録画するための "raspivid"コマンドツールを実行する "VidCamera"クラスを持っています。そのクラスからの映像を記録するための方法は、次のようになります。RPiカメラとJava:ビデオ録画が完了したかどうかを確認する方法は?

public void recordVideo(String filename, int duration) throws IOException { 
    setFilename(filename); 
    setDuration(duration); 
    try { 
     String cmdline = getCmdLine(); 
     Process sysprocess = Runtime.getRuntime().exec(cmdline); 
    } 
    catch (IOException e) { 
     System.out.println("Exception while recording video."); 
     e.printStackTrace(); 
    } 
} 

とgetCmdLine()メソッドは、のような何かを出力するように構成されている:raspivid -w 640 -h 480 -fps 60 - t 5000 -o testvideo.h264

ビデオ録画は、単にコマンドラインツールを使用しているので、期待通りに機能します。しかし、私のコードは、ビデオの録音が終わったときを知らない。

例、私は私のメインクラスからの録画ビデオをテスト:

try { 
     camcorder.recordVideo("myVideoTest.h264", 5000);    
     System.out.println("Video recording completed."); 
    } 
    catch (Exception e) { 
     System.out.println(e); 
    } 

、テキスト「完了ビデオ録画。」 recordVideo()メソッドを呼び出した直後に出力されます。バックグラウンドでは、5秒間の録画は別のスレッドでまだビジー状態です。

どうすればこの問題を解決できますか?コマンドラインツールからのビデオ録画がいつ準備完了になったら、私のコードに知らせることができますか?

+0

解決策の1つは、別のコマンドラインで、カメラがまだビジー状態かどうかを調べることです。しかし、私はそのためのコマンドを見つけることができません。誰でもアイデアがありますか? –

答えて

0

いくつかの研究といくつかの試行錯誤の後、私はraspividプロセスの状態を確認するために、コードのこの部分を作成することになった、[OK]を:

PS -e使用
public boolean getRecordingStatus() throws IOException { 
    // Check from command line tool if process is still running. 
    boolean response = true; 
    try { 
     String cmdResponseLine; 
     String[] cmd = {"/bin/sh", "-c", "ps -e | grep raspivid"}; 
     // Feed the pipe with a String array, does not work with String only. 
     Process sysprocess = Runtime.getRuntime().exec(cmd); 
     BufferedReader in = new BufferedReader(new InputStreamReader(sysprocess.getInputStream())); 

     if ((cmdResponseLine = in.readLine()) != null) 
      response = true; 
     else 
      response = false; 

     in.close(); 
    } 
    catch (Exception e) { 
     System.out.println("Exception while checking for raspivid process..."); 
     e.printStackTrace(); 
    } 
    return response; 
} 

| grepのraspividを"コマンドでは、コードはraspividプロセスがまだ生きているかどうかをチェックします。そうである場合、コマンドは1行の応答テキストをスローします。プロセスが終了すると、応答テキストは表示されません。この応答を解釈することにより、このコードブロックは偽または真の文を返すことができます。

このソリューションへのフィードバックは歓迎します!

関連する問題