Fotocamera individuabile in UnityLocatable camera in Unity

Abilitazione della funzionalità per la videocamera video fotoEnabling the capability for Photo Video Camera

La funzionalità "WebCam" deve essere dichiarata per l'uso della fotocamerada parte di un'app.The "WebCam" capability must be declared for an app to use the camera.

  1. Nell'editor di Unity passare alle impostazioni del lettore passando alla pagina "Edit > Project Settings > Player"In the Unity Editor, go to the player settings by navigating to the "Edit > Project Settings > Player" page
  2. Selezionare la scheda "Windows Store"Select the "Windows Store" tab
  3. Nella sezione "impostazioni di pubblicazione > funzionalità" controllare le funzionalità di Webcam e microfonoIn the "Publishing Settings > Capabilities" section, check the WebCam and Microphone capabilities

Con la fotocamera può essere eseguita una sola operazione alla volta.Only a single operation can occur with the camera at a time. È possibile controllare la modalità con cui la fotocamera è attualmente in uso con UnityEngine. XR. WSA. WebCam. Mode.You can check with mode the camera is currently in with UnityEngine.XR.WSA.WebCam.Mode. Le modalità disponibili sono Photo, video o None.Available modes are photo, video, or none.

Acquisizione fotoPhoto Capture

Spazio dei nomi: UnityEngine. XR. WSA. WebcamNamespace: UnityEngine.XR.WSA.WebCam
Tipo: fotoacquisizioneType: PhotoCapture

Il tipo di acquisizione di foto consente di scattare fotografie con la fotocamera del video.The PhotoCapture type allows you to take still photographs with the Photo Video Camera. Il modello generale per l'uso di fotocapture per scattare una foto è il seguente:The general pattern for using PhotoCapture to take a photo is as follows:

  1. Creare un oggetto di acquisizioneCreate a PhotoCapture object
  2. Creare un oggetto CameraParameters con le impostazioni desiderateCreate a CameraParameters object with the settings you want
  3. Avviare la modalità foto tramite StartPhotoModeAsyncStart Photo Mode via StartPhotoModeAsync
  4. Scattare la foto desiderataTake the photo you want
    • opzionale Interagire con l'immagine(optional) Interact with that picture
  5. Arrestare la modalità foto e pulire le risorseStop Photo Mode and clean up resources

Configurazione comune per l'acquisizione di un'immagineCommon Set Up for PhotoCapture

Per tutti e tre gli usi, iniziare con gli stessi primi tre passaggi precedentiFor all three uses, start with the same first three steps above

Iniziare creando un oggetto di acquisizioneStart by creating a PhotoCapture object

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

Quindi, archiviare l'oggetto, impostare i parametri e avviare la modalità fotoNext, 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);
   }

Alla fine, si userà anche lo stesso codice di pulizia presentato quiIn the end, you'll also use the same clean-up code presented here

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

Dopo questa procedura, è possibile scegliere il tipo di foto da acquisire.After these steps, you can choose which type of photo to capture.

Acquisisci una foto in un fileCapture a Photo to a File

L'operazione più semplice consiste nell'acquisire una foto direttamente in un file.The simplest operation is to capture a photo directly to a file. La foto può essere salvata come JPG o PNG.The photo can be saved as a JPG or a PNG.

Se la modalità Photo è stata avviata correttamente, scattare una foto e archiviarla sul 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!");
       }
   }

Dopo aver acquisito la foto su disco, uscire dalla modalità foto e quindi pulire gli oggettiAfter 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");
       }
   }

Acquisire una foto in un Texture2DCapture a Photo to a Texture2D

Quando si acquisiscono dati in un Texture2D, il processo è simile all'acquisizione su disco.When capturing data to a Texture2D, the process is similar to capturing to disk.

Seguire il processo di configurazione precedente.Follow the setup process above.

In OnPhotoModeStarted acquisire un frame in 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!");
       }
   }

Si applicherà quindi il risultato a una trama e si userà il codice di pulizia comune riportato sopra.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);
   }

Acquisisci una foto e interagisci con i byte non elaboratiCapture a Photo and Interact with the Raw bytes

Per interagire con i byte non elaborati di un frame in memoria, seguire gli stessi passaggi di installazione indicati in precedenza e OnPhotoModeStarted come per acquisire una foto in 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 differenza si trova in OnCapturedPhotoToMemory , in cui è possibile ottenere i byte non elaborati e interagire con essi.The difference is in OnCapturedPhotoToMemory where you can get the raw bytes and interact with them.

In questo esempio verrà creato un elenco che verrà ulteriormente elaborato o applicato a una trama tramite sepixels ()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);
   }

Acquisizione videoVideo Capture

Spazio dei nomi: UnityEngine. XR. WSA. WebcamNamespace: UnityEngine.XR.WSA.WebCam
Tipo: VideoCaptureType: VideoCapture

VideoCapture funziona in modo analogo alla fotoacquisizione.VideoCapture functions similarly to PhotoCapture. Le uniche due differenze sono che è necessario specificare un valore per i frame al secondo (FPS) ed è possibile salvare direttamente sul disco come file con estensione 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. I passaggi per usare VideoCapture sono i seguenti:The steps to use VideoCapture are as follows:

  1. Creare un oggetto VideoCaptureCreate a VideoCapture object
  2. Creare un oggetto CameraParameters con le impostazioni desiderateCreate a CameraParameters object with the settings you want
  3. Avviare la modalità video tramite StartVideoModeAsyncStart Video Mode via StartVideoModeAsync
  4. Avviare la registrazione del videoStart recording video
  5. Interrompi registrazione videoStop recording video
  6. Arrestare la modalità video e pulire le risorseStop Video Mode and clean up resources

Per iniziare, creare l'oggetto VideoCapture VideoCapture m_VideoCapture = null;Start by creating our VideoCapture object VideoCapture m_VideoCapture = null;

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

Successivamente, impostare i parametri da usare per la registrazione e avviare.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 volta avviata, iniziare la registrazioneOnce 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);
       }
   }

Dopo l'avvio della registrazione, è possibile aggiornare l'interfaccia utente o i comportamenti per consentire l'arresto.After recording has started, you could update your UI or behaviors to enable stopping. Qui è sufficiente eseguire il log.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.
   }

In un secondo momento, è necessario arrestare la registrazione usando un timer o un input utente, ad esempio.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);
   }

Dopo che la registrazione è stata interrotta, arrestare la modalità video e pulire le risorse.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;
   }

Risoluzione dei problemiTroubleshooting

  • Non sono disponibili risoluzioniNo resolutions are available
    • Verificare che la funzionalità Webcam sia specificata nel progetto.Ensure the WebCam capability is specified in your project.

Successivo checkpoint di sviluppoNext Development Checkpoint

Se si segue il percorso di checkpoint per lo sviluppo di Unity, è possibile esplorare le funzionalità e le API della piattaforma per la realtà mista.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. Da qui, è possibile passare all'argomento successivo:From here, you can continue to the next topic:

In alternativa, passare direttamente alla distribuzione dell'app in un dispositivo o emulatore:Or jump directly to deploying your app on a device or emulator:

È sempre possibile tornare ai checkpoint per lo sviluppo con Unity in qualsiasi momento.You can always go back to the Unity development checkpoints at any time.

Vedere ancheSee Also

  • [Fotocamera individuabileLocatable camera](../platform-capab ilities-and-apis/locatable-camera.md)