h52.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. <!DOCTYPE html>
  2. <html lang=zh-CN>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport"
  6. content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7. <title>监控详情页</title>
  8. <link href="https://unpkg.com/video.js@7.10.2/dist/video-js.min.css" rel="stylesheet" />
  9. <style type="text/css">
  10. body {
  11. margin: 0;
  12. background-color: #f3f3f3;
  13. }
  14. span.vjs-control-text {
  15. display: none;
  16. }
  17. /* iframe {
  18. width: 375px;
  19. height: 667px;
  20. background-color: #fff;
  21. box-sizing: content-box;
  22. border: none;
  23. } */
  24. .btn-box {
  25. margin-top: 20px;
  26. display: flex;
  27. flex-direction: row;
  28. justify-content: space-around;
  29. align-items: center;
  30. }
  31. .btn-container {
  32. position: relative;
  33. }
  34. .videoBtnPlay {
  35. position: absolute;
  36. height: 100px;
  37. width: 100px;
  38. top: 50%;
  39. left: 50%;
  40. transform: translate(-50%, -50%);
  41. }
  42. .more,
  43. .less {
  44. flex: 1
  45. }
  46. img {
  47. width: 100%;
  48. }
  49. .direc {
  50. width: 150px;
  51. height: 150px;
  52. background: url('https://s3.hnyfwlw.com/webstaticimg/bigdata_app/image/monitor/1.png');
  53. background-size: 100% auto;
  54. background-repeat: no-repeat;
  55. position: relative;
  56. }
  57. .direc div {
  58. width: 50px;
  59. height: 50px;
  60. position: absolute;
  61. }
  62. .top {
  63. top: 0;
  64. left: 50px
  65. }
  66. .bottom {
  67. bottom: 0;
  68. left: 50px
  69. }
  70. .left {
  71. left: 0;
  72. top: 50px
  73. }
  74. .right {
  75. right: 0;
  76. top: 50px
  77. }
  78. #box {
  79. height: 300px;
  80. width: 100%;
  81. background: #000;
  82. overflow: hidden;
  83. }
  84. #dialog {
  85. display: none;
  86. width: 200px;
  87. line-height: 80px;
  88. background: rgba(0, 0, 0, .8);
  89. color: #fff;
  90. text-align: center;
  91. position: absolute;
  92. left: 50%;
  93. margin-left: -100px;
  94. border-radius: 4px;
  95. z-index: 999;
  96. top: 50%;
  97. margin-top: -40px;
  98. }
  99. .imgBtn {
  100. position: absolute;
  101. width: 100%;
  102. padding: 10px;
  103. bottom: 0;
  104. left: 0;
  105. text-align: center;
  106. color: #338cd9;
  107. font-size: 16px;
  108. box-sizing: border-box;
  109. }
  110. .imgBtn img {
  111. display: inline-block;
  112. width: 20px;
  113. height: 20px;
  114. vertical-align: middle;
  115. margin-right: 2px;
  116. margin-bottom: 3px;
  117. }
  118. </style>
  119. </head>
  120. <body>
  121. <div class="btn-container">
  122. <div id="box"> </div>
  123. <div class="videoBtnPlay">
  124. <img src="https://webstaticimg.oss-cn-hangzhou.aliyuncs.com/bigdata_app/img/wxplayer.png" />
  125. </div>
  126. </div>
  127. <div id="dialog">
  128. </div>
  129. <div class="btn-box">
  130. <div class="more" ontouchstart="_configCamera('move', 8)" ontouchend="_stopConfigCamera()">
  131. <image src="https://s3.hnyfwlw.com/webstaticimg/bigdata_app/image/monitor/3.png" mode="widthFix">
  132. </image>
  133. </div>
  134. <div class="direc">
  135. <div class="top" ontouchstart="_configCamera('move', 0)" ontouchend="_stopConfigCamera()">
  136. </div>
  137. <div class="bottom" ontouchstart="_configCamera('move', 1)" ontouchend="_stopConfigCamera()">
  138. </div>
  139. <!-- <div class="photo" ontouchstart="_configCamera('takephoto', '')">
  140. 11111
  141. </div> -->
  142. <div class="left" ontouchstart="_configCamera('move', 2)" ontouchend="_stopConfigCamera()">
  143. </div>
  144. <div class="right" ontouchstart="_configCamera('move', 3)" ontouchend="_stopConfigCamera()">
  145. </div>
  146. </div>
  147. <div class="less" ontouchstart="_configCamera('move', 9)" ontouchend="_stopConfigCamera()">
  148. <image src="https://s3.hnyfwlw.com/webstaticimg/bigdata_app/image/monitor/2.png" mode="widthFix">
  149. </image>
  150. </div>
  151. </div>
  152. <div class="imgBtn">
  153. <img src="images/image.png" />查看图片
  154. </div>
  155. </body>
  156. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  157. <!-- 微信 JS-SDK 如果不需要兼容小程序,则无需引用此 JS 文件。 -->
  158. <!-- <script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.4.0.js"></script> -->
  159. <!-- uni 的 SDK -->
  160. <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
  161. <script src="https://unpkg.com/video.js@7.10.2/dist/video.min.js"></script>
  162. <script type="module">
  163. import Player from './videoPlayer/videoPlay-js.js'
  164. let player = null
  165. //上下左右和拍照
  166. var str = window.location.search.substr(1)
  167. var arr = str.split('&')
  168. console.log(str,arr);
  169. var device_id = arr[0].split('=')[1]
  170. // console.log(device_id);
  171. var accessToken = arr[1].split('=')[1]
  172. var videoType = arr[2]?.split('=')[1]
  173. var token = localStorage.getItem('session_key')
  174. console.log(videoType)
  175. window._configCamera = configCamera;
  176. window._stopConfigCamera = stopConfigCamera;
  177. window._postPic = postPic;
  178. function configCamera(ctrl, movenum) {
  179. if (ctrl == "takephoto") {
  180. if (player) {
  181. // 云联的拍照特殊处理
  182. player.screenshot('yunlianPlayer')
  183. } else {
  184. let url = "http://47.110.79.22:9000/api/api_gateway?method=camera.camera_manage.camera_takephoto"
  185. if(videoType=='dgp'){
  186. url = "http://47.110.79.22:9000/api/api_gateway?method=camera.camera_manage.multi_camera_takephoto"
  187. }
  188. $.ajax({
  189. type: "POST",
  190. url: url,
  191. data: {
  192. device_id: device_id,
  193. token
  194. }
  195. }).then((res) => {
  196. if (res.data.data) {
  197. var data = JSON.parse(res.data.data);
  198. var picUrl = data.data.picUrl;
  199. } else {
  200. console.log(res.data.message)
  201. }
  202. });
  203. }
  204. } else {
  205. let url = "http://47.110.79.22:9000/api/api_gateway?method=camera.camera_manage.ctrl_camera"
  206. let postData = {
  207. device_id: device_id,
  208. token
  209. }
  210. if(videoType=='dgp'){
  211. url = "http://47.110.79.22:9000/api/api_gateway?method=camera.camera_manage.multi_ctrl_camera"
  212. postData.ctrl = movenum
  213. }else{
  214. postData.ctrl = ctrl
  215. postData.movenum = movenum
  216. }
  217. //上下左右、放大、缩小
  218. $.ajax({
  219. type: "POST",
  220. url: url,
  221. data: postData
  222. }).then((res) => {
  223. $('#dialog').html('指令下发成功,请等待...').stop().show(500).delay(3000).hide(500)
  224. })
  225. }
  226. }
  227. function stopConfigCamera() {
  228. if(videoType=='dgp'){
  229. return
  230. }
  231. $.ajax({
  232. type: "POST",
  233. url: "http://47.110.79.22:9000/api/api_gateway?method=camera.camera_manage.ctrl_camera",
  234. data: {
  235. device_id: device_id,
  236. ctrl: "stop",
  237. token
  238. },
  239. });
  240. }
  241. function postPic(file) {
  242. let form = new FormData()
  243. form.append('img_file', file)
  244. form.append('device_id', device_id)
  245. form.append('token', token)
  246. $.ajax({
  247. type: "POST",
  248. url: "http://47.110.79.22:9000/api/api_gateway?method=camera.camera_manage.save_camera_photo",
  249. contentType: false,
  250. processData: false,
  251. data: form
  252. }).then((res) => {
  253. if (res.message == '') {
  254. $('#dialog').html('拍照成功').stop().show(500).delay(1500).hide(500)
  255. } else {
  256. $('#dialog').html(res.data.message).stop().show(500).delay(1500).hide(500)
  257. }
  258. });
  259. }
  260. async function initYunlianPlayer(videoURL) {
  261. var playHtml =
  262. `<div id="yunlianPlayer" style="width: 100%;height: 300px;overflow: hidden;"></div>`;
  263. $("#box").html(playHtml)
  264. player = new Player(['yunlianPlayer'], {
  265. playFileOver: () => {
  266. console.log('播放结束')
  267. },
  268. playError: (id, e) => {
  269. console.log('播放错误', id, e)
  270. },
  271. talkStart: () => {
  272. console.log('对讲开始')
  273. },
  274. runtimeInitializedCallBack: () => {
  275. console.log('播放器初始化完成')
  276. },
  277. captureCallback: (id, data) => {
  278. // console.log('截图返回的数据', data.buffer)
  279. const blob = new Blob([data], {
  280. type: 'image/jpeg'
  281. })
  282. _postPic(blob)
  283. }
  284. })
  285. await player.init()
  286. setTimeout(() => {
  287. player.play('yunlianPlayer', {
  288. streamURL: videoURL,
  289. channelId: '0',
  290. bitStream: '0',
  291. isLive: true
  292. })
  293. }, 1000)
  294. }
  295. $('.videoBtnPlay').click(function() {
  296. $('.videoBtnPlay').hide()
  297. if (videoType == 'dgp') {
  298. $.ajax({
  299. type: "POST",
  300. url: "http://47.110.79.22:9000/api/api_gateway?method=camera.camera_manage.multi_addr_camera",
  301. data: {
  302. device_id: device_id,
  303. token
  304. }
  305. }).then((res) => {
  306. // console.log(JSON.stringify(res))
  307. if (res.message == '') {
  308. var data = null
  309. if (typeof res.data == 'string') {
  310. data = eval('(' + res.data + ')');
  311. } else {
  312. data = res.data;
  313. }
  314. console.log(data, 'data');
  315. let hlsHdSrc = data.rtmp;
  316. var playHtml =
  317. `<video id="myPlayer" poster='' controls playsInline webkit-playsinline src=${hlsHdSrc} style="width:100%; height:100%;"></video>`;
  318. $("#box").html(playHtml)
  319. var myVideo = videojs(`myPlayer`, {
  320. controls: true,
  321. autoplay: 'play',
  322. url: hlsHdSrc,
  323. sources: [{
  324. type: 'application/x-mpegURL',
  325. src: hlsHdSrc,
  326. }],
  327. }, function onPlayerReady() {
  328. myVideo.play()
  329. console.log('准备好了')
  330. });
  331. myVideo.on('play', function() {
  332. console.log('开始播放')
  333. })
  334. } else {
  335. alert(res.message)
  336. }
  337. })
  338. } else {
  339. $.ajax({
  340. type: "POST",
  341. url: "http://47.110.79.22:9000/api/api_gateway?method=camera.camera_manage.addr_camera",
  342. // url: "http://192.168.0.117:8003/api/api_gateway?method=camera.camera_manage.addr_camera",
  343. data: {
  344. device_id: device_id,
  345. token
  346. // device_id: 'FA8690323-1',
  347. // token: localStorage.getItem('session_key')
  348. }
  349. }).then((res) => {
  350. // console.log(JSON.stringify(res))
  351. if (res.message == '') {
  352. var data = null
  353. if (typeof res.data == 'string') {
  354. data = eval('(' + res.data + ')');
  355. } else {
  356. data = res.data;
  357. }
  358. console.log(data, 'data');
  359. if (data.type_id == 2) {
  360. // 大华云联
  361. initYunlianPlayer(data.rtsp)
  362. } else {
  363. let hlsHdSrc = data.type_id == 0 ? data.hls : data.hlsHd;
  364. var playHtml =
  365. `<video id="myPlayer" poster='' controls playsInline webkit-playsinline src=${hlsHdSrc} style="width:100%; height:100%;"></video>`;
  366. $("#box").html(playHtml)
  367. var myVideo = videojs(`myPlayer`, {
  368. controls: true,
  369. autoplay: 'play',
  370. url: hlsHdSrc,
  371. sources: [{
  372. type: 'application/x-mpegURL',
  373. src: hlsHdSrc,
  374. }],
  375. }, function onPlayerReady() {
  376. myVideo.play()
  377. console.log('准备好了')
  378. });
  379. myVideo.on('play', function() {
  380. console.log('开始播放')
  381. })
  382. }
  383. } else {
  384. alert(res.message)
  385. }
  386. })
  387. }
  388. })
  389. document.addEventListener('UniAppJSBridgeReady', function() {
  390. $('.imgBtn').click(function() {
  391. // if (player) {
  392. // player.close('yunlianPlayer')
  393. // player = null
  394. // }
  395. uni.navigateTo({
  396. url: '/pages/monitor/imagelist?id=' + device_id
  397. })
  398. })
  399. });
  400. </script>
  401. </html>