Cámara del teléfono móvil Unity y problemas relacionados

Nota: se usa 5.6, por lo que es imposible tener un reproductor web, lo siguiente se probó en teléfonos Android ~

Uno: use la propia WebCamTexture de Unity para realizar la función de la cámara

    1: Primero construye una escena simple

                Se presiona un botón para encender la cámara

                

           La cámara tiene una vista previa del botón de cambio de cámara para tomar una foto. 

                

  2: codificación

            (1): Bajo la explicación, he leído muchas publicaciones, todas dicen que primero debes solicitar autorización y luego encender la cámara cuando la autorización es exitosa. Lo intenté aquí muchas veces, pero no tiene por qué ser tan problemático. Por ejemplo, escribe lo siguiente

public IEnumerator start()  
    {  
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);  
        if (Application.HasUserAuthorization(UserAuthorization.WebCam))  
        {  
            WebCamDevice[] devices = WebCamTexture.devices;  
            deviceName= devices[0].name;  
            tex=new WebCamTexture(deviceName,300,300,12);  
            tex.Play();  
        }  
    }  
En realidad no es necesario, estas dos oraciones no tienen ningún efecto, la segunda línea de código es verdadera pase lo que pase
Application.RequestUserAuthorization(UserAuthorization.WebCam); 
Application.HasUserAuthorization(UserAuthorization.WebCam)

Esta es la descripción en el documento oficial. Si no lo cree, puede comentar el código anterior tex.play (). En este momento, no habrá un cuadro emergente que muestre si desea autorizar o puede comentar las dos oraciones anteriores. , También mostrará la autorización, la autorización real es la reproducción de la cámara ()

    

    Puedes probarlo tú mismo. Se recomienda desinstalar la instalación anterior cada vez que lo instales o cambiar el nombre del paquete.

  (2): la diferencia entre PC y teléfono móvil

        En la PC, se utiliza para mostrar las fotos tomadas por la cámara photoImg, sin ningún cambio.

        

    Sin embargo, se encontró que estaba torcido 90 grados cuando se publicó en el teléfono móvil.

        

Cuando presionamos el botón "Cambiar", encontraremos que la imagen está invertida. En este momento, necesitamos agregar una función de rotación donde se cambia la imagen.

       photoImage.transform.Rotate (nuevo Vector3 (180, 0, 180));

Esto es muy problemático, por lo que es mejor que el photoImg utilizado para renderizar la cámara sea un cuadrado, y luego el método de inicio determina si la plataforma actual está en el teléfono; si lo está, se girará 90 grados y luego no agregará una función de rotación al cambiar de cámara (El siguiente código no se agrega (porque mi photoImg no es un cuadrado), solo para dar una idea)

    (3): Código (tenga en cuenta la diferencia entre la PC y el teléfono móvil)

        

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
//拍照
public class TakePhotos : MonoBehaviour
{
    public Button startPhotoBtn; //开始拍照
    public Button getPhotoBtn;    //拍照
    public Button changeBtn;    //切换相机
    public RawImage photoImage;    //相机画面
    public RawImage photoPreview;  //预览图

    private string photoPath;  //相机存贮位置

    private WebCamTexture webcam1, webcam2; //这里当作两个摄像机处理
    //   private bool isAndroid;
    void Start()
    {
        startPhotoBtn.onClick.AddListener(InitWebCam);
        getPhotoBtn.onClick.AddListener(GetPhoto);
        changeBtn.onClick.AddListener(ChangeCamera);
        //photoPath = Application.dataPath + "/Texture/";
        //if (!Directory.Exists(photoPath))
        //{ Directory.CreateDirectory(photoPath); }
    }

    private void InitWebCam()
    {
        WebCamDevice[] devices = WebCamTexture.devices;

        int webCamLength = devices.Length;
        if (webCamLength <= 0)
        {
            Debug.Log("没有获取摄像机设备");
            return;
        }
        else if (webCamLength == 1)
        {
            //所选相机可能不支持请求的参数指定的宽度,高度和帧速率。在这种情况下,将使用最接近的可用值
            //根据纹理图片拍摄大小
            Debug.Log("有一个摄像机设备");
            webcam1 = new WebCamTexture(WebCamTexture.devices[0].name,
                (int)photoImage.rectTransform.rect.width,
                (int)photoImage.rectTransform.rect.height, 12);
        }
        else if (webCamLength == 2)
        {
            Debug.Log("有两个摄像机设备");
            webcam1 = new WebCamTexture(WebCamTexture.devices[0].name,
           (int)photoImage.rectTransform.rect.width,
           (int)photoImage.rectTransform.rect.height, 12);
            webcam2 = new WebCamTexture(WebCamTexture.devices[1].name,
               (int)photoImage.rectTransform.rect.width,
               (int)photoImage.rectTransform.rect.height, 12);
        }
        if (webcam1 != null)  //当获取摄像机不为空
        {
            OpenWebCam1();
        }
    }

    /// <summary>
    /// 打开摄像头1
    /// </summary>
    private void OpenWebCam1()
    {
        //当webcam2不为空且在运行的时候
        if (webcam2 != null && webcam2.isPlaying)
        {
            webcam2.Stop();
        }
        webcam1.Play();
        photoImage.texture = webcam1;
    }
    /// <summary>
    /// 打开摄像头2
    /// </summary>
    private void OpenWebCam2()
    {
        if (webcam1 != null && webcam1.isPlaying)
        {
            webcam1.Stop();
        }
        webcam2.Play();
        photoImage.texture = webcam2;
    }
    /// <summary>
    /// 获取正在运行的摄像头
    /// </summary>
    /// <returns></returns>
    private WebCamTexture GetCurrentWebCam()
    {
        return webcam1.isPlaying ? webcam1 : webcam2;
    }
    /// <summary>
    /// 切换相机
    /// </summary>
    private void ChangeCamera()
    {
        //如果web2为空,即只有一个摄像头 返回
        if (webcam2 == null) return;
        //得到另一个相机
        WebCamTexture otherWebCam = GetCurrentWebCam() == webcam1 ? webcam2 : webcam1;
        if (otherWebCam == webcam1)
        {
            OpenWebCam1();
        }
        else
        {
            OpenWebCam2();
        }
        photoImage.transform.Rotate(new Vector3(180, 0, 180));
    }

    /// <summary>
    /// 拍照
    /// </summary>
    private void GetPhoto()
    {
        StartCoroutine(IEGetPhoto());
    }
    private IEnumerator IEGetPhoto()
    {
        //获取当前的摄像头
        WebCamTexture currentWebCam = GetCurrentWebCam();
        currentWebCam.Pause();
        //必须加上这一句yield return,不然没办法ReadPixels
        yield return new WaitForEndOfFrame();
        //根据photoImage   new一个texture2D
        Texture2D texture2D =
            new Texture2D((int)photoImage.rectTransform.rect.width, (int)photoImage.rectTransform.rect.height, TextureFormat.ARGB32, false);
        //读取像素
        texture2D.ReadPixels(new Rect(0, Screen.height - photoImage.rectTransform.rect.height, photoImage.rectTransform.rect.width, photoImage.rectTransform.rect.height), 0, 0, false);

        texture2D.Apply();

        yield return new WaitForEndOfFrame();
        photoPreview.texture = texture2D;  //预览图
        currentWebCam.Play();
        //IO写入
        //byte[] bs = texture2D.EncodeToPNG();
        // string name = DateTime.Now.ToString("yyyyMMdd_HHmmss")+".png";
        // File.WriteAllBytes(photoPath+name, bs);
    }

}

    El comentario anterior es que las imágenes se pueden escribir en el disco en la plataforma de la PC

La grabación está escrita en el teléfono para el álbum actualmente no tiene éxito de acuerdo con la práctica de las conexiones en línea  posibles, pero no aparecerá de inmediato en el álbum.

Todo lo posible todavía tiene que escribir complementos para lograr

    

Supongo que te gusta

Origin blog.csdn.net/K20132014/article/details/79846040
Recomendado
Clasificación