Unity での場所を特定できるカメラLocatable camera in Unity

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

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

  1. Unity エディターは、「> プロジェクトの設定 > プレーヤーの編集」のページに移動して、player の設定に移動します。In the Unity Editor, go to the player settings by navigating to "Edit > Project Settings > Player" page
  2. "Windows Store" タブをクリックします。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. どちらのモード (写真、ビデオ、または none) にカメラがある現在を判断するには、UnityEngine.XR.WSA.WebCam.Mode を確認することができます。To determine which mode (photo, video, or none) the camera is currently in, you can check UnityEngine.XR.WSA.WebCam.Mode.

写真をキャプチャPhoto Capture

名前空間: UnityEngine.XR.WSA.WebCamNamespace: 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. 使用して写真モードを開始StartPhotoModeAsyncStart Photo Mode via StartPhotoModeAsync
  4. 目的の写真を撮るTake the desired photo
    • (省略可能)その図との対話します。(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

メモリ内の生バイトと対話するフレーム、に従って同じ設定には、上記の手順とOnPhotoModeStarted Texture2D に写真をキャプチャするようにします。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.XR.WSA.WebCamNamespace: UnityEngine.XR.WSA.WebCam
種類: VideoCaptureType: VideoCapture

VideoCapture関数に非常によく似たPhotoCaptureします。VideoCapture functions very similarly to PhotoCapture. 2 つの違いはフレーム/秒 (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. 使用してビデオ モードの開始StartVideoModeAsyncStart 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);
       }
   }

記録の開始後は、"stopping"を有効にするには、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