Appareil photo localisable dans UnityLocatable camera in Unity

Activation de la fonctionnalité de Photo Video CameraEnabling the capability for Photo Video Camera

La fonctionnalité « WebCam » doit être déclarée pour qu’une application utilise l' appareil photo.The "WebCam" capability must be declared for an app to use the camera.

  1. Dans l’éditeur Unity, accédez aux paramètres du lecteur en accédant à la page « modifier les paramètres du projet > > Player ».In the Unity Editor, go to the player settings by navigating to the "Edit > Project Settings > Player" page
  2. Sélectionner l’onglet « Windows Store »Select the "Windows Store" tab
  3. Dans la section « fonctionnalités de > des paramètres de publication », vérifiez les fonctionnalités de la webcam et du microphoneIn the "Publishing Settings > Capabilities" section, check the WebCam and Microphone capabilities

Une seule opération peut être effectuée avec la caméra à la fois.Only a single operation can occur with the camera at a time. Vous pouvez vérifier le mode dans lequel l’appareil photo se trouve actuellement avec UnityEngine. XR. WSA. WebCam. mode.You can check with mode the camera is currently in with UnityEngine.XR.WSA.WebCam.Mode. Les modes disponibles sont photo, Video ou None.Available modes are photo, video, or none.

Capture de photosPhoto Capture

Espace de noms : UnityEngine. XR. WSA. WebcamNamespace: UnityEngine.XR.WSA.WebCam
Type : PhotoCaptureType: PhotoCapture

Le type PhotoCapture vous permet de prendre des photographies avec la caméra photo.The PhotoCapture type allows you to take still photographs with the Photo Video Camera. Le modèle général d’utilisation de PhotoCapture pour prendre une photo est le suivant :The general pattern for using PhotoCapture to take a photo is as follows:

  1. Créer un objet PhotoCaptureCreate a PhotoCapture object
  2. Créer un objet CameraParameters avec les paramètres souhaitésCreate a CameraParameters object with the settings you want
  3. Démarrer le mode photo via StartPhotoModeAsyncStart Photo Mode via StartPhotoModeAsync
  4. Prenez la photo souhaitéeTake the photo you want
    • facultatif Interagir avec cette image(optional) Interact with that picture
  5. Arrêter le mode photo et nettoyer les ressourcesStop Photo Mode and clean up resources

Configuration commune pour la PhotoCaptureCommon Set Up for PhotoCapture

Pour les trois utilisations, commencez par les trois premières étapes ci-dessus.For all three uses, start with the same first three steps above

Commencez par créer un objet PhotoCaptureStart by creating a PhotoCapture object

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

Stockez ensuite votre objet, définissez vos paramètres et démarrez le mode photoNext, store your object, set your 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);
   }

À la fin, vous utiliserez également le même code de nettoyage présenté iciIn the end, you'll also use the same clean-up code presented here

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

Après ces étapes, vous pouvez choisir le type de photo à capturer.After these steps, you can choose which type of photo to capture.

Capturer une photo dans un fichierCapture a Photo to a File

L’opération la plus simple consiste à capturer directement une photo dans un fichier.The simplest operation is to capture a photo directly to a file. La photo peut être enregistrée au format JPG ou PNG.The photo can be saved as a JPG or a PNG.

Si vous avez correctement démarré le mode photo, prenez une photo et stockez-la sur le disqueIf you successfully started photo mode, 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!");
       }
   }

Après avoir capturé la photo sur le disque, quittez le mode photo, puis nettoyez vos objets.After capturing the photo to disk, exit photo mode and then clean up your 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");
       }
   }

Capturer une photo sur un Texture2DCapture a Photo to a Texture2D

Lors de la capture de données dans un Texture2D, le processus est similaire à la capture sur le disque.When capturing data to a Texture2D, the process is similar to capturing to disk.

Suivez le processus d’installation ci-dessus.Follow the setup process above.

Dans OnPhotoModeStarted, capturez un frame en mémoire.In OnPhotoModeStarted, 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!");
       }
   }

Vous appliquerez ensuite votre résultat à une texture et utiliserez le code de nettoyage commun ci-dessus.You'll then apply your 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);
   }

Capturer une photo et interagir avec les octets brutsCapture a Photo and Interact with the Raw bytes

Pour interagir avec les octets bruts d’un dans le frame de mémoire, suivez les mêmes étapes de configuration que ci-dessus et OnPhotoModeStarted comme pour la capture d’une photo sur un Texture2D.To interact with the raw bytes of an in memory frame, follow the same setup steps as above and OnPhotoModeStarted as in capturing a photo to a Texture2D. La différence réside dans OnCapturedPhotoToMemory où vous pouvez récupérer les octets bruts et interagir avec eux.The difference is in OnCapturedPhotoToMemory where you can get the raw bytes and interact with them.

Dans cet exemple, vous allez créer une liste qui sera traitée ou appliquée à une texture à l’aide de setPixels ()In this example, you'll create a List to 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);
   }

Capture vidéoVideo Capture

Espace de noms : UnityEngine. XR. WSA. WebcamNamespace: UnityEngine.XR.WSA.WebCam
Type : VideoCaptureType: VideoCapture

VideoCapture fonctionne de la même façon que PhotoCapture.VideoCapture functions similarly to PhotoCapture. Les deux seules différences sont que vous devez spécifier une valeur d’images par seconde (FPS) et vous ne pouvez enregistrer directement sur le disque qu’en tant que fichier. 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 a .mp4 file. Les étapes d’utilisation de VideoCapture sont les suivantes :The steps to use VideoCapture are as follows:

  1. Créer un objet VideoCaptureCreate a VideoCapture object
  2. Créer un objet CameraParameters avec les paramètres souhaitésCreate a CameraParameters object with the settings you want
  3. Démarrer le mode vidéo via StartVideoModeAsyncStart Video Mode via StartVideoModeAsync
  4. Démarrer l’enregistrement vidéoStart recording video
  5. Arrêter l’enregistrement de la vidéoStop recording video
  6. Arrêter le mode vidéo et nettoyer les ressourcesStop Video Mode and clean up resources

Commencez par créer notre objet VideoCapture VideoCapture m_VideoCapture = null ;Start by creating our VideoCapture object VideoCapture m_VideoCapture = null;

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

Ensuite, configurez les paramètres souhaités pour l’enregistrement et démarrer.Next, set up the parameters you'll 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!");
       }
   }

Une fois démarré, commencez l’enregistrement.Once started, 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);
       }
   }

Une fois l’enregistrement démarré, vous pouvez mettre à jour votre interface utilisateur ou les comportements pour activer l’arrêt.After recording has started, you could update your UI or behaviors to enable stopping. Ici, vous venez de consigner.Here you 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.
   }

À un moment ultérieur, vous souhaiterez arrêter l’enregistrement à l’aide d’un minuteur ou d’une entrée utilisateur, par exemple.At a later point, you'll want to stop the recording using a timer or user input, for instance.

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

Une fois l’enregistrement arrêté, arrêtez le mode vidéo et nettoyez vos ressources.Once the recording has stopped, stop video mode and clean up your 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;
   }

DépannageTroubleshooting

  • Aucune résolution n’est disponibleNo resolutions are available
    • Assurez-vous que la fonctionnalité webcam est spécifiée dans votre projet.Ensure the WebCam capability is specified in your project.

Point de contrôle de développement suivantNext Development Checkpoint

Si vous suivez le parcours du point de contrôle de développement Unity que nous avons disposé, vous êtes en train d’explorer les fonctionnalités de la plateforme de réalité mixte et les API.If you're following the Unity development checkpoint journey we've laid out, you're in the midst of exploring the Mixed Reality platform capabilities and APIs. À partir d’ici, vous pouvez passer au sujet suivant :From here, you can continue to the next topic:

Ou accéder directement au déploiement de votre application sur un appareil ou un émulateur :Or jump directly to deploying your app on a device or emulator:

Vous pouvez revenir aux points de contrôle de développement Unity à tout moment.You can always go back to the Unity development checkpoints at any time.

Voir aussiSee Also

  • [Appareil photo localisableLocatable camera](../platform-capab ilities-and-apis/locatable-camera.md)