Unity调用外部摄像头/网络摄像头/手机摄像头

基于WebCamTexture

       WebCamTexutre可以支持采集卡、网络摄像头和移动端(手机、平板)设备摄像头的捕获一般代码会如下写:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class WebCamManager : MonoBehaviour 
{
    string deviceName;
    WebCamTexture webCam;
    // Use this for initialization
    void Start () 
    {
        WebCamDevice[] devices = WebCamTexture.devices;
        deviceName = devices[0].name;
        webCam = new WebCamTexture(deviceName, 1920, 1080, 30);//设置宽、高和帧率   
        this.GetComponent().texture = webCam;//渲染脚本所在有RawImage组件的物体
        webCam.Play();
    }
}

关于这个类

WebCamDevice这个类,值得关注的除了它的length,还有devices[0].availableResolutions:这个设备支持的所有分辨率,其他比如kind镜头模式,是否前置摄像头,是否支持自动对焦,用的不大多,而且都是只可以get不可以set的。

关于对焦

有的时候,我们使用摄像头的画面去进行拍照拍摄,并不希望镜头自动对焦,因为一个人入画后,在自动对焦模式下,镜头的焦距就有可能会调整,造成在一段时间内的模糊。如果需要针对设置对焦模式,比如无限远,或者手动。要么使用摄像头自带的驱动软件去调整,要么使用第三方插件。比如EasyAR、Vofuria的CameDevice类的SetFocusMode。一般可以设置如下几种:

0:normal 常规默认对焦方式

1:trigger 点击触发对焦

2:continous 持续自动对焦

3:infinity 焦距无穷远

4:macro 微距

关于摄像头许可

常能查到的Unity调用外部摄像头的代码,都会去使用以下代码去判断是否设备给予了访问摄像头的权限:

    IEnumerator Start()
    {
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);

        if (Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            //巴拉巴拉
        }
    }

但其实我尝试之后发现,发布到移动端,选择了允许访问摄像头权限之后,摄像头画面并不会出现,我找了Unity的API说明如下:

Unity调用外部摄像头/网络摄像头/手机摄像头_第1张图片

所以Application.HasUserAuthorization函数只能用来在web player应用上判断是否有权限。

那么应该怎么去实现对获取摄像头权限对判断呢?我目前是用WebCamTexture的变量、是否获取到摄像头设备来做判断,如下:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class webcamins : MonoBehaviour
{
    public RawImage rawImage;
    private string deviceName;

    WebCamTexture tex = null;
    void Update()
    {
        if(tex == null)
        {
            WebCamDevice[] devices = WebCamTexture.devices;
            if (devices.Length == 0) return;
            deviceName = devices[0].name;
            tex = new WebCamTexture(deviceName, 1280, 800, 30);
            rawImage.texture = tex;
            tex.Play();
        }
    }
}

基于Avpro Live Camera插件

这款插件不是一般的厉害,但也不是一般的贵。

Unity调用外部摄像头/网络摄像头/手机摄像头_第2张图片

厉害在于它可以帮助你设置亮度、对比度、色相、饱和度、锐度、gamma(层次?),白平衡、曝光补偿。

它可以基于camera,基于ugui,基于3d物体去渲染。

使用方式

导入插件之后,运行GUIDemo如图:

Unity调用外部摄像头/网络摄像头/手机摄像头_第3张图片

如果需要新建场景,需要关注的是LiveCamera的AVProLiveCamera脚本,LiveCameraManager的AVProLiveCameraManager脚本,以及如果你需要在ugui上渲染用:AVProLiveCameraUGUIComponent,在3d物体上渲染用:AVProLiveCameraMeshApply。

运行起来以后,会在AVProLiveCamera脚本看到上文说的拍摄参数:

Unity调用外部摄像头/网络摄像头/手机摄像头_第4张图片


待开发

在当下,手机自身的拍照功能已经非常强大,除非对微距、长焦、大光圈造虚化有很高的要求,否则手机是能满足业务需求。尤其让我们想要得到的,是手机自身拍照App的美颜、美化成果。以上的技术方式都无法得到手机App的效果,所以我想这块核心价值是做在了手机的软件层,而不是也许dsp芯片这一层,如果厂商不开放API,原生开发无法获得,用Unity就更别想了,我记得目前华为开发者联盟里面给到的API,也就是一个慢动作。所以在这一行,如何使用手机自带拍照App的能力去做内容会是一个待开发的题目,而因此结合手机去做拍照的互动应用可能会越来越多。

文章中有错误或者做的不好的地方,欢迎指正。

 

你可能感兴趣的:(Unity3D)