UITest.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Serenegiant.UVC;
  5. using UnityEngine;
  6. using UnityEngine.UI;
  7. public class UITest : MonoBehaviour
  8. {
  9. public GameObject togglePrefab; // 拖入一个Toggle预设体
  10. public GameObject sliderPrefab; // 拖入一个Slider预设体
  11. public GameObject spawnPoint;
  12. public UVCManager mUVCManager;
  13. public UVCDrawer mUVCDrawer;
  14. public UVCManager.CameraInfo cameraInfo;
  15. [SerializeField] Dropdown _dropdownResolution;
  16. //自动曝光
  17. bool bAutoAE = false;
  18. Slider CTRLAEABSSlider;
  19. //PU_BRIGHTNESS(亮度)
  20. //PU_CONTRAST(对比度)
  21. //PU_HUE(色调)
  22. //PU_SATURATION(饱和度)
  23. //PU_SHARPNESS(锐度)
  24. //PU_GAMMA(伽玛)
  25. //PU_WB_TEMP(白平衡温度)
  26. //PU_WB_COMPO(白平衡分量)
  27. //PU_BACKLIGHT(背光补偿)
  28. //PU_GAIN(增益)
  29. //PU_POWER_LF(电源线频率)
  30. //PU_HUE_AUTO(色相,自动)
  31. //PU_WB_TEMP_AUTO(白平衡温度,自动)
  32. //PU_WB_COMPO_AUTO(白平衡分量,自动)
  33. //PU_DIGITAL_MULT(数字乘法器)
  34. //PU_DIGITAL_LIMIT(数字乘数限制)
  35. //PU_AVIDEO_STD(模拟视频标准)
  36. //PU_AVIDEO_LOCK(模拟视频锁定状态)
  37. //PU_CONTRAST_AUTO(对比度,自动)
  38. string[] sliderNameArray = new string[]{
  39. "自动曝光模式",
  40. "曝光时间(绝对)",
  41. "亮度", //
  42. "对比度",
  43. "色调",
  44. "饱和度",
  45. "锐度",
  46. "白平衡温度",
  47. //"白平衡分量",
  48. "伽玛",
  49. "背光补偿",
  50. "增益" };
  51. string[] sliderStrArray = new string[]{
  52. "CTRL_AE",
  53. "CTRL_AE_ABS",
  54. "PU_BRIGHTNESS",
  55. "PU_CONTRAST",
  56. "PU_HUE",
  57. "PU_SATURATION",
  58. "PU_SHARPNESS",
  59. "PU_GAMMA",
  60. "PU_WB_TEMP",
  61. //"PU_WB_COMPO",
  62. "PU_BACKLIGHT",
  63. "PU_GAIN" };
  64. public void initSlider()
  65. {
  66. for (int i = 0; i < sliderStrArray.Length; i++)
  67. {
  68. string typeStr = sliderStrArray[i];
  69. UInt64 _VALUE = cameraInfo.GetTypeByName(typeStr);
  70. //不支持的,跳过
  71. bool bContains = cameraInfo.ContainsKey(_VALUE);
  72. if (!bContains) continue;
  73. if (typeStr == "CTRL_AE")
  74. {
  75. //如果是自动曝光,使用toggle 选择
  76. GameObject toggleObject = Instantiate(togglePrefab, spawnPoint.transform);
  77. toggleObject.SetActive(true);
  78. Text labelObj = toggleObject.transform.Find("Label").GetComponent<Text>();
  79. labelObj.text = sliderNameArray[i];
  80. Toggle toggle = toggleObject.GetComponent<Toggle>();
  81. UVCCtrlInfo _AEInfo = cameraInfo.GetInfo(_VALUE);
  82. bAutoAE = _AEInfo.def == 8 ? true : false;
  83. toggle.onValueChanged.AddListener((bool bValue) =>
  84. {
  85. //Debug.Log("Toggle value changed to: " + bValue + " from " + _VALUE);
  86. if (typeStr == "CTRL_AE")
  87. {
  88. //开关控制是否自动曝光
  89. bAutoAE = bValue;
  90. if(CTRLAEABSSlider) CTRLAEABSSlider.interactable = !bAutoAE;
  91. int _value = bValue ? 8 : 1;
  92. //Debug.Log("_value " + _value);
  93. cameraInfo.SetValue(_VALUE, _value);
  94. }
  95. });
  96. }
  97. else
  98. {
  99. //其余使用slider
  100. GameObject sliderObject = Instantiate(sliderPrefab, spawnPoint.transform);
  101. sliderObject.SetActive(true);
  102. Slider slider = sliderObject.GetComponent<Slider>();
  103. if (typeStr == "CTRL_AE_ABS") {
  104. CTRLAEABSSlider = slider;
  105. slider.interactable = !bAutoAE;
  106. }
  107. Text textObj = sliderObject.transform.Find("text").GetComponent<Text>();
  108. Text titleTextObj = sliderObject.transform.Find("title").GetComponent<Text>();
  109. titleTextObj.text = sliderNameArray[i];//类型名字
  110. if (slider != null)
  111. {
  112. UVCCtrlInfo _UVCCtrlInfo = cameraInfo.GetInfo(_VALUE);
  113. slider.minValue = _UVCCtrlInfo.min;
  114. slider.maxValue = _UVCCtrlInfo.max;
  115. slider.wholeNumbers = true;
  116. slider.value = _UVCCtrlInfo.def;
  117. // 可以添加更多的配置,例如添加监听事件等
  118. textObj.text = _UVCCtrlInfo.def + "";
  119. //如果有存储到初始值,设置一次
  120. //cameraInfo.SetValue(BRIGHTNESS_VALUE, xxx);
  121. slider.onValueChanged.AddListener((newValue) =>
  122. {
  123. var _value = Mathf.FloorToInt(newValue);
  124. textObj.text = _value + "";
  125. //Debug.Log("Slider value changed to: " + newValue + " from " + _VALUE);
  126. cameraInfo.SetValue(_VALUE, _value);
  127. });
  128. }
  129. }
  130. }
  131. }
  132. public void getDevices()
  133. {
  134. List<UVCManager.CameraInfo> cameraInfos = mUVCManager.GetAttachedDevices();
  135. for (int i = 0; i < cameraInfos.Count; i++)
  136. {
  137. Debug.Log("Device Name " + i + ":" + cameraInfos[i].DeviceName);
  138. }
  139. cameraInfo = cameraInfos[0];
  140. }
  141. void Awake()
  142. {
  143. if (mUVCDrawer)
  144. mUVCDrawer.StartPreviewAction += UVCIsReady;
  145. _dropdownResolution.onValueChanged.AddListener(v =>
  146. {
  147. SetResolution(v);
  148. });
  149. }
  150. void OnDestroy()
  151. {
  152. if (mUVCDrawer)
  153. mUVCDrawer.StartPreviewAction -= UVCIsReady;
  154. }
  155. /**
  156. * UVC機器とのネゴシエーション時に
  157. * H.264を優先してネゴシエーションするかどうか
  158. * Android実機のみ有効
  159. * true: H.264 > MJPEG > YUV
  160. * false: MJPEG > H.264 > YUV
  161. */
  162. public bool PreferH264 = false;
  163. private const int FRAME_TYPE_MJPEG = 0x000007;
  164. private const int FRAME_TYPE_H264 = 0x000014;
  165. void SetResolution(int optionIndex)
  166. {
  167. _dropdownResolution.SetValueWithoutNotify(optionIndex);
  168. switch (optionIndex)
  169. {
  170. case 0:
  171. Resize(1280, 960);
  172. break;
  173. case 1:
  174. Resize(1280, 720);
  175. break;
  176. case 2:
  177. Resize(640, 480);
  178. break;
  179. case 3:
  180. Resize(640, 360);
  181. break;
  182. case 4:
  183. Resize(320, 240);
  184. break;
  185. }
  186. }
  187. void Resize(int width,int height) {
  188. if (cameraInfo == null) return;
  189. int[] frameTypes = {
  190. PreferH264 ? FRAME_TYPE_H264 : FRAME_TYPE_MJPEG,
  191. PreferH264 ? FRAME_TYPE_MJPEG : FRAME_TYPE_H264,
  192. };
  193. foreach (var frameType in frameTypes)
  194. {
  195. Debug.Log("Resize frameType:" + frameType + " = " + width + " : "+ height);
  196. if (UVCManager.onResize(cameraInfo.device.id, frameType, width, height) == 0)
  197. {
  198. Debug.Log("frameType:" + frameType);
  199. break;
  200. }
  201. }
  202. }
  203. public void UVCIsReady(Texture texture)
  204. {
  205. getDevices();
  206. //Dictionary<UInt64, UVCCtrlInfo> keyValuePairs = cameraInfo.getCtrlInfos();
  207. //foreach (KeyValuePair<UInt64, UVCCtrlInfo> kvp in keyValuePairs)
  208. //{
  209. // Debug.Log($"Key: {kvp.Key}, Value: {kvp.Value}");
  210. //}
  211. List<UInt64> list = cameraInfo.GetCtrls();
  212. for (int i = 0; i < list.Count; i++)
  213. {
  214. int value = cameraInfo.GetValue(list[i]);
  215. UVCCtrlInfo uVCCtrlInfo = cameraInfo.GetInfo(list[i]);
  216. Debug.Log(i + "= Ctrls:" + list[i] + ",Value:" + value + ",info:" + uVCCtrlInfo.ToString());
  217. }
  218. //Int32 value = cameraInfo.GetValue(0x00000001);
  219. //Debug.Log("Brightness:"+value);
  220. initSlider();
  221. }
  222. // Start is called before the first frame update
  223. void Start()
  224. {
  225. }
  226. // Update is called once per frame
  227. void Update()
  228. {
  229. }
  230. }