2

アップデート:

いくつかの優れた解決策がありましたが、前提に問題があることに気付きました。プロセスが実行されると、rt.exec は Java コードに戻らないようです。お世話になりました!


プログラムで毎秒スクリーンキャップを取得したいのですが、各スクリーンキャップのタイトルはタイムスタンプにする必要があります。これを達成するためにvlcを使用しています。

    starttime = System.nanoTime();
    screencapProcess = rt.exec("C:\\VLC\\vlc screen:// --dshow-vdev=screen-capture-recorder --dshow-fps=1 -I dummy --dummy-quiet --rate=1 --video-filter=scene --vout=dummy --scene-format=jpg --scene-ratio=1 --scene-prefix=snap --scene-path=" + path +" --scene-prefix="+ "ScreenCapAt" +   ( String.valueOf(((long)System.nanoTime() - starttime)).substring(9, 14))+" vlc://quit ");

関連する部分は次のとおりです。

    String.valueOf(((long)System.nanoTime() - starttime)).substring(9, 14))

これにより、nanoTimes が 1 未満の場合、範囲外のインデックス例外が発生します。

「System.nanoTime() - starttime」をこの行の外側の変数として宣言して長さを取得することはできません。それは私の時間を変更するからです。

この宣言されていない長さが不明な変数の最後の 5 桁を 1 行で取得する方法はありますか?

この回答は、私の rt.exec 行に収まる必要があります。

いくつかの考え:

  • ビット単位のシフトとマスキング。
  • 私の.execへのパイプ
  • 後処理
  • 新しいクラスの作成
  • System.nanoTime() - starttime を再度呼び出すと、操作の時間が長くなり、計算が中断されます。
  • キャプチャの時間をアトミックに取得するより良い方法はありますか?
4

4 に答える 4

1

1 行で (calc の宣言を除く):

float calc;
String diff = String.valueOf((calc = (long)System.nanoTime() - starttime)).substring(Math.max(0, String.valueOf(calc).length() - 5));
于 2013-11-11T07:57:25.980 に答える
1

複数の行で実行する必要があると思います。文字列の長さを評価せずにそれを行う方法がわかりません。これは私が思いつくことができる最高のものです:

String diff = ""+((long)System.nanoTime() - starttime);
String lastfive = diff.substring(Math.max(0, diff.length() - 5));

更新:すべてを1行で行う方法を見つけました:

String lastFive = (""+((long)System.nanoTime() - starttime)).replaceAll("(.*)(\\d{5}$)","$2");
于 2013-11-11T07:49:08.067 に答える
0

これを試して:

 String diff=""+ ((long)System.nanoTime() - starttime);

 if(diff.length() >4){// Check if diff length is less than 5
   String lastFive=diff.substring(diff.length()-5, diff.length());
 }
于 2013-11-11T07:32:46.207 に答える
0

試す:

String diff=""+ ((long)System.nanoTime() - starttime));
String lastFive=  diff.length() > 4 ? 
                 diff.substring(diff.length()-5, diff.length()) : diff;

screencapProcess = rt.exec("C:\\VLC\\vlc screen:// --dshow-vdev=screen-capture-recorder --dshow-fps=1 -I dummy --dummy-quiet --rate=1 --video-filter=scene --vout=dummy --scene-format=jpg --scene-ratio=1 --scene-prefix=snap --scene-path=" + path +" --scene-prefix="+ "ScreenCapAt" +  lastfive +" vlc://quit ");

アップデート

値を再計算したい場合は、別の関数に入れることをお勧めします

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

    long starttime = (long)System.nanoTime(); 
    Thread.sleep(1000); 
    System.out.println("test1 " + getLastFive (starttime)); 
    Thread.sleep(500); 
    System.out.println("test2 " + getLastFive (starttime)); 
    Thread.sleep(1000);
} 

static private String getLastFive (long starttime) {

    String diff=""+ ((long)System.nanoTime() - starttime); 
    String lastFive= diff.length() > 4 ? diff.substring(diff.length()-5, diff.length()) : diff; 
    return lastFive;

}
于 2013-11-11T07:36:50.110 に答える