11

ARアプリに動画キャプチャ機能を追加しようとしています。基本的に、画面上で何が起こっているかを記録し、ビデオとして保存します (ユーザーが共有できるようにします)。AR アプリは Vuforia-Unity SDK で作成されています。iOSプラットフォームでこれを成功裏に達成しました。

ただし、Android プラットフォームで同じことを行うのは非常に困難です。(デバイスをルート化せずにこれを達成したいと考えています)

以下は私たちの進歩です:

  1. Vuforia プログラムがカメラを占有しているため、ビデオ ストリームにアクセスできません。

  2. 各フレームのスクリーンショットをキャプチャして、それらをいくつかのビデオ出力に結合しようとしました。しかし、フレームレートは非常に悪いです (1 fps 未満)。スクリーン ショットをキャプチャするのに 700 ミリ秒かかります。

私は間違った方向から考えていますか?どんな助けでも大歓迎です!どうもありがとう!アイザック

以下は私のテストコードです:

public void acquireScreenshot() {
    DisplayMetrics metrics = new DisplayMetrics();
    WindowManager WM = (WindowManager) MainActivity.this.getSystemService(Context.WINDOW_SERVICE);
    Display display = WM.getDefaultDisplay();
    display.getMetrics(metrics);
    int height = metrics.heightPixels; // screen height
    int width = metrics.widthPixels; // screen width
    int pixelformat = display.getPixelFormat();
    PixelFormat localPixelFormat1 = new PixelFormat();
    PixelFormat.getPixelFormatInfo(pixelformat, localPixelFormat1);
    int deepth = localPixelFormat1.bytesPerPixel;

    byte[] arrayOfByte = new byte[height* width* deepth];
    long tmp = System.currentTimeMillis();
    try {
        for(int i = 0 ; i < 10 ; i++){
            InputStream localInputStream = readAsRoot();
            DataInputStream localDataInputStream = new DataInputStream(
                    localInputStream);
            android.util.Log.e("mytest", "-----read start-------");
            localDataInputStream.readFully(arrayOfByte);
            android.util.Log.e("mytest", "-----read end-------time = "  + (System.currentTimeMillis() -tmp ));
            localInputStream.close();

            File mid = new File("/mnt/sdcard/AAA");

            if(!mid.exists()){
                mid.mkdir();
            }

            FileOutputStream out = new FileOutputStream(new File(
                    "/mnt/sdcard/AAA/"+System.currentTimeMillis()+".png"));  
            int[] tmpColor = new int[width * height];
            int r, g, b;
            tmp = System.currentTimeMillis();
            android.util.Log.e("mytest", "-----bitmap start-------");
            for (int j = 0; j < width * height * deepth; j+=deepth) {
                b = arrayOfByte[j]&0xff;
                g = arrayOfByte[j+1]&0xff;
                r = arrayOfByte[j+2]&0xff;
                tmpColor[j/deepth] = (r << 16) | (g << 8) | b |(0xff000000);
            }
            Bitmap tmpMap = Bitmap.createBitmap(tmpColor, width, height,
                    Bitmap.Config.ARGB_8888);
            android.util.Log.e("mytest", "-----bitmap end-------time = "  + (System.currentTimeMillis() -tmp ));

            tmp = System.currentTimeMillis();
            android.util.Log.e("mytest", "-----compress start-------");
            tmpMap.compress(Bitmap.CompressFormat.PNG, 100, out);
            android.util.Log.e("mytest", "-----compress end-------time = "  + (System.currentTimeMillis() -tmp ));
            out.close();
            Thread.sleep(40);
        }


    } catch (Exception e) {
        android.util.Log.e("mytest", "Exception");
        e.printStackTrace();
    }

}
4

0 に答える 0