Cámara localizable en UnityLocatable camera in Unity

Habilitación de la funcionalidad de la cámara de vídeo fotográficoEnabling the capability for Photo Video Camera

La funcionalidad "WebCam" se debe declarar para que una aplicación use la cámara.The "WebCam" capability must be declared for an app to use the camera.

  1. En el editor de Unity, vaya a la página "editar > configuración del proyecto > reproductor" para ir a la configuración del reproductor.In the Unity Editor, go to the player settings by navigating to the "Edit > Project Settings > Player" page
  2. Seleccione la pestaña "tienda Windows"Select the "Windows Store" tab
  3. En la sección "configuración de publicación > funcionalidades", compruebe las funcionalidades de la cámara web y el micrófonoIn the "Publishing Settings > Capabilities" section, check the WebCam and Microphone capabilities

Solo se puede realizar una operación con la cámara a la vez.Only a single operation can occur with the camera at a time. Puede comprobar con el modo en que la cámara está actualmente en con UnityEngine. XR. WSA. WebCam. Mode.You can check with mode the camera is currently in with UnityEngine.XR.WSA.WebCam.Mode. Los modos disponibles son fotográfico, vídeo o ninguno.Available modes are photo, video, or none.

Captura de fotoPhoto Capture

Espacio de nombres: UnityEngine. XR. WSA. webcamNamespace: UnityEngine.XR.WSA.WebCam
Tipo: fotocaptureType: PhotoCapture

El tipo de fotocaptura le permite tomar fotografías con la cámara de vídeo fotográfico.The PhotoCapture type allows you to take still photographs with the Photo Video Camera. El patrón general para usar fotocapture para tomar una foto es el siguiente:The general pattern for using PhotoCapture to take a photo is as follows:

  1. Creación de un objeto FotocaptureCreate a PhotoCapture object
  2. Cree un objeto CameraParameters con los valores que desee.Create a CameraParameters object with the settings you want
  3. Iniciar el modo fotográfico a través de StartPhotoModeAsyncStart Photo Mode via StartPhotoModeAsync
  4. Tome la foto que deseeTake the photo you want
    • opta Interactuar con esa imagen(optional) Interact with that picture
  5. Detener el modo fotográfico y limpiar los recursosStop Photo Mode and clean up resources

Configuración común para fotocapturaCommon Set Up for PhotoCapture

Para los tres usos, empiece con los tres primeros pasos anteriores.For all three uses, start with the same first three steps above

Inicio mediante la creación de un objeto FotocaptureStart by creating a PhotoCapture object

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

A continuación, almacene el objeto, establezca los parámetros e inicie el modo fotográfico.Next, 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);
   }

Al final, también usará el mismo código de limpieza que se muestra aquí.In the end, you'll also use the same clean-up code presented here

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

Después de estos pasos, puede elegir el tipo de foto que desea capturar.After these steps, you can choose which type of photo to capture.

Capturar una foto en un archivoCapture a Photo to a File

La operación más sencilla consiste en capturar una foto directamente en un archivo.The simplest operation is to capture a photo directly to a file. La foto se puede guardar como JPG o PNG.The photo can be saved as a JPG or a PNG.

Si ha iniciado correctamente el modo fotográfico, tome una foto y almacénela en el discoIf 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!");
       }
   }

Después de capturar la foto en el disco, salga del modo fotográfico y limpie los objetosAfter 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");
       }
   }

Capturar una foto en un Texture2DCapture a Photo to a Texture2D

Al capturar datos en un Texture2D, el proceso es similar a la captura en disco.When capturing data to a Texture2D, the process is similar to capturing to disk.

Siga el proceso de instalación anterior.Follow the setup process above.

En OnPhotoModeStarted, Capture un fotograma en la memoria.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!");
       }
   }

A continuación, aplicará el resultado a una textura y usará el código de limpieza común anterior.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);
   }

Capturar una foto e interactuar con los bytes sin formatoCapture a Photo and Interact with the Raw bytes

Para interactuar con los bytes sin formato de un marco de memoria, siga los mismos pasos de configuración descritos anteriormente y OnPhotoModeStarted como en la captura de una foto en 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 diferencia está en OnCapturedPhotoToMemory , donde puede obtener los bytes sin formato e interactuar con ellos.The difference is in OnCapturedPhotoToMemory where you can get the raw bytes and interact with them.

En este ejemplo, creará una lista que se procesará o se aplicará a una textura a través 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);
   }

Captura de vídeoVideo Capture

Espacio de nombres: UnityEngine. XR. WSA. webcamNamespace: UnityEngine.XR.WSA.WebCam
Tipo: VideoCaptureType: VideoCapture

VideoCapture funciona de forma similar a fotocapture.VideoCapture functions similarly to PhotoCapture. Las únicas dos diferencias son que debe especificar un valor de fotogramas por segundo (FPS) y solo puede guardar directamente en el disco como un archivo. 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. Los pasos para usar VideoCapture son los siguientes:The steps to use VideoCapture are as follows:

  1. Creación de un objeto de VideoCaptureCreate a VideoCapture object
  2. Cree un objeto CameraParameters con los valores que desee.Create a CameraParameters object with the settings you want
  3. Iniciar el modo de vídeo a través de StartVideoModeAsyncStart Video Mode via StartVideoModeAsync
  4. Iniciar grabación de vídeoStart recording video
  5. Detener grabación de vídeoStop recording video
  6. Detener el modo de vídeo y limpiar los recursosStop Video Mode and clean up resources

Empiece por crear el objeto VideoCapture de videocaptura m_VideoCapture = null;Start by creating our VideoCapture object VideoCapture m_VideoCapture = null;

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

A continuación, configure los parámetros que desea para la grabación y el inicio.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!");
       }
   }

Una vez iniciado, comience la grabación.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);
       }
   }

Una vez iniciada la grabación, puede actualizar la interfaz de usuario o los comportamientos para habilitar la detención.After recording has started, you could update your UI or behaviors to enable stopping. Aquí solo tiene que registrar.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.
   }

En un momento posterior, querrá detener la grabación mediante un temporizador o una entrada del usuario, por ejemplo.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);
   }

Una vez que la grabación se ha detenido, detenga el modo de vídeo y limpie los recursos.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;
   }

Solución de problemasTroubleshooting

  • No hay ninguna solución disponibleNo resolutions are available
    • Asegúrese de que la funcionalidad de la cámara web está especificada en el proyecto.Ensure the WebCam capability is specified in your project.

Siguiente punto de control de desarrolloNext Development Checkpoint

Si está siguiendo el viaje de punto de control de desarrollo de Unity que hemos diseñado, está en medio de explorar las API y funcionalidades de la plataforma de realidad mixta.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. Desde aquí, puede continuar con el siguiente tema:From here, you can continue to the next topic:

O bien puede ir directamente a la implementación de la aplicación en un dispositivo o emulador:Or jump directly to deploying your app on a device or emulator:

Puede volver a los puntos de control de desarrollo de Unity en cualquier momento.You can always go back to the Unity development checkpoints at any time.

Consulte tambiénSee Also

  • [Cámara localizableLocatable camera](../platform-capab ilities-and-apis/locatable-camera.md)