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说明如下:
所以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();
}
}
}
这款插件不是一般的厉害,但也不是一般的贵。
厉害在于它可以帮助你设置亮度、对比度、色相、饱和度、锐度、gamma(层次?),白平衡、曝光补偿。
它可以基于camera,基于ugui,基于3d物体去渲染。
导入插件之后,运行GUIDemo如图:
如果需要新建场景,需要关注的是LiveCamera的AVProLiveCamera脚本,LiveCameraManager的AVProLiveCameraManager脚本,以及如果你需要在ugui上渲染用:AVProLiveCameraUGUIComponent,在3d物体上渲染用:AVProLiveCameraMeshApply。
运行起来以后,会在AVProLiveCamera脚本看到上文说的拍摄参数:
在当下,手机自身的拍照功能已经非常强大,除非对微距、长焦、大光圈造虚化有很高的要求,否则手机是能满足业务需求。尤其让我们想要得到的,是手机自身拍照App的美颜、美化成果。以上的技术方式都无法得到手机App的效果,所以我想这块核心价值是做在了手机的软件层,而不是也许dsp芯片这一层,如果厂商不开放API,原生开发无法获得,用Unity就更别想了,我记得目前华为开发者联盟里面给到的API,也就是一个慢动作。所以在这一行,如何使用手机自带拍照App的能力去做内容会是一个待开发的题目,而因此结合手机去做拍照的互动应用可能会越来越多。
文章中有错误或者做的不好的地方,欢迎指正。