WebCamTexture 在第一秒或第二秒出现全 0

WebCamTexture Coming Up With All 0s in the First Second or Two

我正在使用 WebCamTexture,我在我的 Start 方法中启动它,然后我 运行 另一种方法。我使用 GetPixels() 获取像素,但是,它们都显示为 (0, 0, 0)。有没有解决这个问题或我可以等待的方式(Unity 似乎使用 while 循环和 WaitForSeconds 崩溃)。这是我当前的启动方法:

void Start () {

    rawImage = gameObject.GetComponent<RawImage> ();
    rawImageRect = rawImage.GetComponent<RectTransform> ();

    webcamTexture = new WebCamTexture();
    rawImage.texture = webcamTexture;
    rawImage.material.mainTexture = webcamTexture;

    webcamTexture.Play();

    Method ();

    loadingTextObject.SetActive (false);
    gameObject.SetActive (true);

}

void Method(){

    print (webcamTexture.GetPixels [0]);

}

并且每次都会打印 (0, 0, 0) 颜色。

在协程中执行网络摄像头操作,然后使用 yield return new WaitForSeconds(2); 等待 2 秒,然后再调用 webcamTexture.GetPixels

void Start () {

    rawImage = gameObject.GetComponent<RawImage> ();
    rawImageRect = rawImage.GetComponent<RectTransform> ();

    StartCoroutine(startWebCam());

    loadingTextObject.SetActive (false);
    gameObject.SetActive (true);

}

private IEnumerator startWebCam()
{
    webcamTexture = new WebCamTexture();
    rawImage.texture = webcamTexture;
    rawImage.material.mainTexture = webcamTexture;

    webcamTexture.Play();

    //Wait for 2 seconds
    yield return new WaitForSeconds(2);

    //Now call GetPixels
    Method();

}

void Method(){
    print (webcamTexture.GetPixels [0]);
}

或者像乔在评论区说的那样。等待几秒钟是不可靠的。您可以在阅读之前等待宽度有一些东西 it.Just 替换

yield return new WaitForSeconds(2);

while (webcamTexture.width < 100)
{
    yield return null;
}

当您抓取所请求图像的大小时,两秒钟可能会花费很多时间。

WebCamTexture 有一个您可以访问的请求 width/height,它会在调用一次 GetPixels 后保存纹理的 "real" width/height。我们在与用户共享照片的两个项目中使用了名为 CameraCaptureKit (https://www.assetstore.unity3d.com/en/#!/content/56673 ) 的资产。

那里使用的代码采用 WebCamTexture 并抓取每一帧的帧,直到它 returns 纹理的宽度和高度。

在更新函数中调用了 TryDummySnapshot,直到正确返回大小。

// ANDREAS added this: In some cases we apparently don't get correct width and height until we have tried to read pixels
    // from the buffer.
    void TryDummySnapshot( ) {
        if(!gotAspect) {
            if( webCamTexture.width>16 ) {
                if( Application.platform == RuntimePlatform.IPhonePlayer ) {
                    if(verbose)Debug.Log("Already got width height of WebCamTexture.");
                } else { 
                }
                gotAspect = true;
            } else {
                if(verbose)Debug.Log ("Taking dummy snapshot");
                if( tmpImg == null ) {}
                Color32[] c = webCamTexture.GetPixels32();
            }
        }
    }

如果您不想等到报告或分配大小并且目标平台是 iOS (iPhone/iPad),也可以编写一个直接从中获取大小的插件通过扩展 CameraCapture.mm Unity 中的相机代码:

- (void)captureOutput:(AVCaptureOutput*)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection*)connection
{
intptr_t tex = (intptr_t)CMVideoSampling_SampleBuffer(&self->_cmVideoSampling, sampleBuffer, &self->_width, &self->_height);

_staticWebCamTexWidth = self->_width;
_staticWebCamTexWidth = self->_height;

UnityDidCaptureVideoFrame(tex, self->_userData);

if( self.firstFrameCallback!=nil ) {
    [self fireFirstFrame];
}
}

self->width / height 可以在作为插件方法添加的方法中返回,例如:

[DllImport("__Internal")]
private static extern int GetWebCamTextureWidth ();

[DllImport("__Internal")]
private static extern int GetWebCamTextureHeight ();

然后在对象代码中

extern "C" int GetWebCamTextureWidth() { return _staticWebCamTexWidth;  }
extern "C" int GetWebCamTextureHeight() { return _staticWebCamTexHeight;  }

这是我为使用 unity 的 iOS 社交游戏之一提出的解决方案。在 Android 我们又回到了之前描述的方法。