iOS&Androidカメラレンダリング比較

1702 ワード

AndroidがGLで画面にレンダリングするのはiOSとは大きく違います.
レンダービューの作成(Create Render view)
iOSはCAEAGLLayerを使用しています.このlayerを有効にするには、一般的にUIViewでlayerClass+(Class)layerClass{return[CAEAGLLayerclass];}をリロードします.
AdnroidはGLSurfaceViewであり、GLSurfaceViewを実現する.Rendererインタフェースは、onDrawFrameに各フレームのコールバック関数があります.GLのデバイスコンテキストはGLSurfaceViewで作成されるので、テクスチャ、シェーダなどは、onSurfaceCreatedコールバックを待ってから呼び出すしかありません.そうしないと作成に失敗します.Androidでは、jniレイヤのANativeWindowを使用してレンダリングする方法もあります.
カメラを開く
iOSは、カメラの入力、YUV/RGBAデータの出力、マイクの出力、PCMの出力など、すべてのハードウェアを管理するAVCaptureSessionです.Androidは比較的簡単で、Cameraを作ればいいです.カメラ構成のパラメータが多い.
テクスチャをすばやく読み込む
iOSには使いやすいCVOpenGLESTexture Androidがありますが、簡単にGL 3を使ったPBO、もう一つはGL 2の拡張です.
回転
これは当然カメラが出力するのは固定方向です.この方面はAndroidに敗れた.setDisplayOrientation public static void setCameraDisplayOrientation(Activity activity, int cameraId, android.hardware.Camera camera) { android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); }がGLでレンダリングされている場所で、Surface TextureがgetTransformMatrixを呼び出して回転するマトリクスを得てGL頂点シェーダに適用します.