我一直在研究网络摄像头流,以便在Unity3D中的Android设备上捕获视频和照片。为了捕获网络摄像头源,我发现的大多数示例都使用特定的WebCamTexture对象来访问设备的相机硬件。我目前能够捕获相机输入,但网络摄像头纹理将数据存储为 Color32[]。我在下面找到了这个解决方案,用于将 Color32[] 转换为字节 [],但它似乎正在交换红色和蓝色通道。
https://stackoverflow.com/a/21575147/8115962
有没有办法防止红色和蓝色通道被反转?
这是另一种将数组Color32
从WebCamTexture
转换为字节数组的方法:
首先,创建一个结构来保存转换后的数组:
[StructLayout(LayoutKind.Explicit)]
public struct Color32Array
{
[FieldOffset(0)]
public byte[] byteArray;
[FieldOffset(0)]
public Color32[] colors;
}
要转换WebCamTexture
:
WebCamTexture webcamTex = new WebCamTexture();
创建该结构的新实例:
Color32Array colorArray = new Color32Array();
使用适当的大小初始化 Color32:
colorArray.colors = new Color32[webcamTex.width * webcamTex.height];
填充Color32
自动填充字节数组:
webcamTex.GetPixels32(colorArray.colors);
现在,您可以使用字节数组colorArray.byteArray
。
如果需要,加载到纹理 2D 中:
Texture2D tex = new Texture2D(2, 2);
tex.LoadRawTextureData(colorArray.byteArray);
tex.Apply();
就像我在评论中所说的那样,最好将WebCamTexture
转换为Texture2D
然后转换为jpeg或png,然后通过网络发送。这将减小图像的大小。有关详细信息,请参阅此答案。