Unity Android前置摄像头WTF bug

4

我正在使用Unity为Android开发应用程序。尝试使用前置摄像头,从WebCamTexture获取数据。后置摄像头可以正常工作,但是当我尝试翻转相机时,出现了这个糟糕的情况:

**bitstream == (int)0xAFAFAFAF

作为Unity控制台中的错误。然后,WebCamTexture完全停止工作,即使是后置摄像头也无法使用。有什么想法吗?
附注:使用的是Unity 5.3.3p1...可能是Unity的一个bug吗?

1
在切换到前置摄像头之前尝试暂停相机,然后在切换完成后恢复。 - EvilTak
1
我停止了相机而不是暂停它... 天啊,我真的很讨厌安卓。现在,在我切换后,后置摄像头仍然可以使用,但前置摄像头没有图像。甚至没有黑屏。 - Tiziano Coroneo
@TizianoCoroneo,考虑一下这个技巧:实际上总是获取两个摄像头...只需使用两个WebCamTexture平面...并在特定时间只显示您想要的摄像头! - Fattie
1
对于任何正在搜索此问题的人,以下是在所有平台上获取旋转、旋转和镜像正确的精确代码: http://answers.unity3d.com/questions/773464/webcamtexture-correct-resolution-and-ratio.html#answer-1148424 - Fattie
@JoeBlow 我刚刚花了4小时来调整镜像缩放和其他细节…否则这篇文章会是一个非常巨大的感谢。 - Tiziano Coroneo
显示剩余3条评论
2个回答

6

注意

针对阅读本文的人,Unity出现了一个新插件(2016年),

https://www.assetstore.unity3d.com/en/#!/content/52154

如果你想在Unity中使用设备摄像头,那么你“必须”使用此插件。

Unity的设备摄像头功能是在Unity中最糟糕的东西——它甚至不是Alpha版质量。这是Unity中最差劲的东西,荒谬的是他们把它包含在内,仅仅是一个测试运行。

编写一个双平台真正本地、高速摄像头插件非常困难。现在第一个插件已经出现,没有比它更好的选择了。 Unity的东西很糟糕,你可能需要花费2-3周才能得到一个大致工作的相机。


这里有一个相当可靠的方法来解决改变相机的灾难!

public void CycleCams()
        {
        StartCoroutine(_cycle());
        }
    
    private IEnumerator _cycle()
        {
        WebCamDevice[] d = WebCamTexture.devices;
        if ( d.Length <= 1 )
            {
            Debug.Log("only one.");
            if (d.Length==1) Debug.Log("Name is " +d[0].name);
            yield break;
            }
        
        Debug.Log("0 " +d[0].name);
        Debug.Log("1 " +d[1].name);
        
        if ( wct.deviceName == d[0].name )
            {
            wct.Stop();
            yield return new WaitForSeconds(.1f);
            wct.deviceName = d[1].name;
            yield return new WaitForSeconds(.1f);
            wct.Play();
            
            nameDisplay.text = "\"" +wct.deviceName +"\"";
            yield break;
            }
        
        if ( wct.deviceName == d[1].name )
            {
            wct.Stop();
            yield return new WaitForSeconds(.1f);
            wct.deviceName = d[0].name;
            yield return new WaitForSeconds(.1f);
            wct.Play();
            
            nameDisplay.text = "\"" +wct.deviceName +"\"";
            yield break;
            }
        }

真正的防弹。我几乎有同样的代码,解决方案是将我的函数转换为协程并等待一小部分时间。谢谢(顺便说一句,我即将向Unity抱怨他们关于WebCamTexture的文档质量) - Tiziano Coroneo
我也设法解决了这个问题,但是我要重申:这是一个丑陋的解决方案。使用#if #elif针对操作系统进行手动检查设备方向、哪个相机正在工作等等。 - Tiziano Coroneo
我通过记录Webcamtexture.devices获得了这些名称。而且看起来数组的第一个元素(最好不要使用它的名字)始终是后置 - 第二个始终是前置;否则,您可以检查WebCamDevice.isFrontFacing(或类似的内容),但实际上我不知道可靠程度有多高。 - Tiziano Coroneo
1
是的,你非常正确。 名称并不重要。 我现在只是假设如果有两个项目,第二个就是自拍摄像头。 好想法。 干杯 - Fattie

3

经过多年的Android ROM破解和调试,我必须告诉你,你会经常遇到这种情况。最糟糕的是,由于制造商使用的固件不同,你的程序在一部手机上运行得很好,但在另一部手机上却不能正常运行,这是因为制造商让事情变得非常复杂。随着Marshmallow的发布,由于他们对所有人都加大了限制,你将看到越来越少的这种情况发生。我建议你只需要学习一点Java代码,并直接从Unity中调用它。


我已经解决了丑陋的消息,但前置摄像头仍然没有图像。 三星Galaxy S4 GT-i9506,搭载Android 5.0.1。 - Tiziano Coroneo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接