UITest.cs 10 KB

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