Unity でのお持ちのカメラLocatable camera in Unity

フォトビデオカメラの機能を有効にするEnabling the capability for Photo Video Camera

アプリでカメラを使用するには、"WebCam" 機能を宣言する必要があります。The "WebCam" capability must be declared for an app to use the camera.

  1. Unity エディターで、[Edit > Project Settings > Player] ページに移動して、windows media player の設定に移動します。In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player" page
  2. [Windows ストア] タブをクリックします。Click on the "Windows Store" tab
  3. [発行設定 > 機能] セクションで、 Web カメラマイクの機能を確認します。In the "Publishing Settings > Capabilities" section, check the WebCam and Microphone capabilities

カメラで一度に実行できる操作は1つだけです。Only a single operation can occur with the camera at a time. カメラを現在使用しているモード (写真、ビデオ、またはなし) を確認するには、UnityEngine. XR を確認します。To determine which mode (photo, video, or none) the camera is currently in, you can check UnityEngine.XR.WSA.WebCam.Mode.

写真のキャプチャPhoto Capture

名前空間: UnityEngine. XRNamespace: UnityEngine.XR.WSA.WebCam
種類: PhotoCaptureType: PhotoCapture

Photocaptureの種類を使用すると、写真ビデオカメラで引き続き写真を撮ることができます。The PhotoCapture type allows you to take still photographs with the Photo Video Camera. Photocaptureを使用して写真を撮影する一般的なパターンを次に示します。The general pattern for using PhotoCapture to take a photo is as follows:

  1. Photocaptureオブジェクトを作成するCreate a PhotoCapture object
  2. 必要な設定でCameraParametersオブジェクトを作成するCreate a CameraParameters object with the settings we want
  3. Startphotomodeasyncを使用して写真モードを開始するStart Photo Mode via StartPhotoModeAsync
  4. 目的の写真を撮影するTake the desired photo
    • optionalその画像と対話する(optional) Interact with that picture
  5. フォトモードを停止してリソースをクリーンアップするStop Photo Mode and clean up resources

PhotoCapture 用の一般的な設定Common Set Up for PhotoCapture

3つのすべての使用について、上記と同じ最初の3つの手順から開始します。For all three uses, we start with the same first 3 steps above

まず、 Photocaptureオブジェクトを作成します。We start by creating a PhotoCapture object

PhotoCapture photoCaptureObject = null;
   void Start()
   {
       PhotoCapture.CreateAsync(false, OnPhotoCaptureCreated);
   }

次に、オブジェクトを保存し、パラメーターを設定して、写真モードを開始します。Next we store our object, set our parameters, and start Photo Mode

void OnPhotoCaptureCreated(PhotoCapture captureObject)
   {
       photoCaptureObject = captureObject;

       Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();

       CameraParameters c = new CameraParameters();
       c.hologramOpacity = 0.0f;
       c.cameraResolutionWidth = cameraResolution.width;
       c.cameraResolutionHeight = cameraResolution.height;
       c.pixelFormat = CapturePixelFormat.BGRA32;

       captureObject.StartPhotoModeAsync(c, false, OnPhotoModeStarted);
   }

最後に、ここで紹介したものと同じクリーンアップコードを使用します。In the end, we will also use the same clean up code presented here

void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result)
   {
       photoCaptureObject.Dispose();
       photoCaptureObject = null;
   }

これらの手順の後に、キャプチャする写真の種類を選択できます。After these steps, you can choose which type of photo to capture.

写真をファイルにキャプチャするCapture a Photo to a File

最も簡単な操作は、写真を直接ファイルにキャプチャすることです。The simplest operation is to capture a photo directly to a file. 写真は、JPG または PNG として保存できます。The photo can be saved as a JPG or a PNG.

写真モードを正常に開始した場合は、写真を撮影してディスクに保存します。If we successfully started photo mode, we now will take a photo and store it on disk

private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)
   {
       if (result.success)
       {
           string filename = string.Format(@"CapturedImage{0}_n.jpg", Time.time);
           string filePath = System.IO.Path.Combine(Application.persistentDataPath, filename);

           photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);
       }
       else
       {
           Debug.LogError("Unable to start photo mode!");
       }
   }

写真をディスクにキャプチャした後、写真モードを終了し、オブジェクトをクリーンアップします。After capturing the photo to disk, we will exit photo mode and then clean up our objects

void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result)
   {
       if (result.success)
       {
           Debug.Log("Saved Photo to disk!");
           photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
       }
       else
       {
           Debug.Log("Failed to save Photo to disk");
       }
   }

写真を Texture2D に取り込むCapture a Photo to a Texture2D

Texture2D にデータをキャプチャする場合、プロセスはディスクへのキャプチャと非常によく似ています。When capturing data to a Texture2D, the process is extremely similar to capturing to disk.

上記のセットアッププロセスに従います。We will follow the set up process above.

Onphotomodestarted 開始したときに、フレームをメモリにキャプチャします。In OnPhotoModeStarted, we will capture a frame to memory.

private void OnPhotoModeStarted(PhotoCapture.PhotoCaptureResult result)
   {
       if (result.success)
       {
           photoCaptureObject.TakePhotoAsync(OnCapturedPhotoToMemory);
       }
       else
       {
           Debug.LogError("Unable to start photo mode!");
       }
   }

次に、結果をテクスチャに適用し、上記の一般的なクリーンアップコードを使用します。We will then apply our result to a texture and use the common clean up code above.

void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame)
   {
       if (result.success)
       {
           // Create our Texture2D for use and set the correct resolution
           Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
           Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);
           // Copy the raw image data into our target texture
           photoCaptureFrame.UploadImageDataToTexture(targetTexture);
           // Do as we wish with the texture such as apply it to a material, etc.
       }
       // Clean up
       photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
   }

写真をキャプチャし、生のバイトを操作するCapture a Photo and Interact with the Raw bytes

インメモリフレームの生バイトを操作するには、Texture2D に写真をキャプチャする場合と同じように、上記とOnphotomodestarted 開始したときと同じセットアップ手順に従います。To interact with the raw bytes of an in memory frame, we will follow the same set up steps as above and OnPhotoModeStarted as in capturing a photo to a Texture2D. 違いは、生のバイトを取得して操作できるOnCapturedPhotoToMemoryです。The difference is in OnCapturedPhotoToMemory where we can get the raw bytes and interact with them.

この例では、 setpixels () を使用してさらに処理またはテクスチャに適用できるリスト を作成します。In this example, we will create a List which could be further processed or applied to a texture via SetPixels()

void OnCapturedPhotoToMemory(PhotoCapture.PhotoCaptureResult result, PhotoCaptureFrame photoCaptureFrame)
   {
       if (result.success)
       {
           List<byte> imageBufferList = new List<byte>();
           // Copy the raw IMFMediaBuffer data into our empty byte list.
           photoCaptureFrame.CopyRawImageDataIntoBuffer(imageBufferList);

           // In this example, we captured the image using the BGRA32 format.
           // So our stride will be 4 since we have a byte for each rgba channel.
           // The raw image data will also be flipped so we access our pixel data
           // in the reverse order.
           int stride = 4;
           float denominator = 1.0f / 255.0f;
           List<Color> colorArray = new List<Color>();
           for (int i = imageBufferList.Count - 1; i >= 0; i -= stride)
           {
               float a = (int)(imageBufferList[i - 0]) * denominator;
               float r = (int)(imageBufferList[i - 1]) * denominator;
               float g = (int)(imageBufferList[i - 2]) * denominator;
               float b = (int)(imageBufferList[i - 3]) * denominator;

               colorArray.Add(new Color(r, g, b, a));
           }
           // Now we could do something with the array such as texture.SetPixels() or run image processing on the list
       }
       photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
   }

ビデオキャプチャVideo Capture

名前空間: UnityEngine. XRNamespace: UnityEngine.XR.WSA.WebCam
種類: VideoCaptureType: VideoCapture

VideoCapturephotocaptureと非常に似ています。VideoCapture functions very similarly to PhotoCapture. 2つの違いは、1秒あたりのフレーム数 (FPS) の値を指定する必要があり、mp4 ファイルとして直接ディスクに保存できることだけです。The only two differences are that you must specify a Frames Per Second (FPS) value and you can only save directly to disk as an .mp4 file. VideoCaptureを使用する手順は次のとおりです。The steps to use VideoCapture are as follows:

  1. VideoCaptureオブジェクトを作成するCreate a VideoCapture object
  2. 必要な設定でCameraParametersオブジェクトを作成するCreate a CameraParameters object with the settings we want
  3. Startvideomodeasyncを使用してビデオモードを開始するStart Video Mode via StartVideoModeAsync
  4. ビデオの録画を開始するStart recording video
  5. ビデオ記録の停止Stop recording video
  6. ビデオモードを停止してリソースをクリーンアップするStop Video Mode and clean up resources

まず、 VideoCaptureオブジェクトVideoCapture m_VideoCapture = nullを作成します。We start by creating our VideoCapture object VideoCapture m_VideoCapture = null;

void Start ()
   {
       VideoCapture.CreateAsync(false, OnVideoCaptureCreated);
   }

次に、記録と開始のために必要なパラメーターを設定します。We then will set up the parameters we will want for the recording and start.

void OnVideoCaptureCreated (VideoCapture videoCapture)
   {
       if (videoCapture != null)
       {
           m_VideoCapture = videoCapture;

           Resolution cameraResolution = VideoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();
           float cameraFramerate = VideoCapture.GetSupportedFrameRatesForResolution(cameraResolution).OrderByDescending((fps) => fps).First();

           CameraParameters cameraParameters = new CameraParameters();
           cameraParameters.hologramOpacity = 0.0f;
           cameraParameters.frameRate = cameraFramerate;
           cameraParameters.cameraResolutionWidth = cameraResolution.width;
           cameraParameters.cameraResolutionHeight = cameraResolution.height;
           cameraParameters.pixelFormat = CapturePixelFormat.BGRA32;

           m_VideoCapture.StartVideoModeAsync(cameraParameters,
                                               VideoCapture.AudioState.None,
                                               OnStartedVideoCaptureMode);
       }
       else
       {
           Debug.LogError("Failed to create VideoCapture Instance!");
       }
   }

開始したら、記録を開始します。Once started, we will begin the recording

void OnStartedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
   {
       if (result.success)
       {
           string filename = string.Format("MyVideo_{0}.mp4", Time.time);
           string filepath = System.IO.Path.Combine(Application.persistentDataPath, filename);

           m_VideoCapture.StartRecordingAsync(filepath, OnStartedRecordingVideo);
       }
   }

記録が開始されたら、UI または動作を更新して停止を有効にすることができます。After recording has started, you could update your UI or behaviors to enable stopping. ここでログを記録します。Here we just log

void OnStartedRecordingVideo(VideoCapture.VideoCaptureResult result)
   {
       Debug.Log("Started Recording Video!");
       // We will stop the video from recording via other input such as a timer or a tap, etc.
   }

後で、記録を停止します。At a later point, we will want to stop the recording. これは、たとえば、タイマーやユーザー入力によって発生する可能性があります。This could happen from a timer or user input, for instance.

// The user has indicated to stop recording
   void StopRecordingVideo()
   {
       m_VideoCapture.StopRecordingAsync(OnStoppedRecordingVideo);
   }

記録が停止したら、ビデオモードを停止し、リソースをクリーンアップします。Once the recording has stopped, we will stop video mode and clean up our resources.

void OnStoppedRecordingVideo(VideoCapture.VideoCaptureResult result)
   {
       Debug.Log("Stopped Recording Video!");
       m_VideoCapture.StopVideoModeAsync(OnStoppedVideoCaptureMode);
   }

   void OnStoppedVideoCaptureMode(VideoCapture.VideoCaptureResult result)
   {
       m_VideoCapture.Dispose();
       m_VideoCapture = null;
   }

トラブルシューティングTroubleshooting

  • 解決策はありませんNo resolutions are available
    • Web カメラ機能がプロジェクトで指定されていることを確認します。Ensure the WebCam capability is specified in your project.

関連項目See Also