h52.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  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. <link rel="stylesheet" href="./font/iconfont.css" />
  10. <style type="text/css">
  11. body {
  12. margin: 0;
  13. background-color: #f3f3f3;
  14. }
  15. span.vjs-control-text {
  16. display: none;
  17. }
  18. /* iframe {
  19. width: 375px;
  20. height: 667px;
  21. background-color: #fff;
  22. box-sizing: content-box;
  23. border: none;
  24. } */
  25. .btn-box {
  26. margin-top: 20px;
  27. display: flex;
  28. flex-direction: row;
  29. justify-content: space-around;
  30. align-items: center;
  31. }
  32. .btn-container {
  33. position: relative;
  34. }
  35. .videoBtnPlay {
  36. position: absolute;
  37. height: 100px;
  38. width: 100px;
  39. top: 50%;
  40. left: 50%;
  41. transform: translate(-50%, -50%);
  42. }
  43. .more,
  44. .less {
  45. flex: 1
  46. }
  47. img {
  48. width: 100%;
  49. }
  50. .direc {
  51. width: 150px;
  52. height: 150px;
  53. background: url('https://s3.hnyfwlw.com/webstaticimg/bigdata_app/image/monitor/1.png');
  54. background-size: 100% auto;
  55. background-repeat: no-repeat;
  56. position: relative;
  57. display: flex;
  58. justify-content: center;
  59. align-items: center;
  60. }
  61. .direc div {
  62. width: 50px;
  63. height: 50px;
  64. position: absolute;
  65. }
  66. .photo {
  67. font-size: 30px;
  68. color: #4ec467;
  69. padding: 16px;
  70. }
  71. .top {
  72. top: 0;
  73. left: 50px
  74. }
  75. .bottom {
  76. bottom: 0;
  77. left: 50px
  78. }
  79. .left {
  80. left: 0;
  81. top: 50px
  82. }
  83. .right {
  84. right: 0;
  85. top: 50px
  86. }
  87. #box {
  88. height: 300px;
  89. width: 100%;
  90. background: #000;
  91. overflow: hidden;
  92. }
  93. #dialog {
  94. display: none;
  95. min-width: 200px;
  96. line-height: 80px;
  97. background: rgba(0, 0, 0, .8);
  98. color: #fff;
  99. text-align: center;
  100. position: absolute;
  101. left: 50%;
  102. margin-left: -100px;
  103. border-radius: 4px;
  104. z-index: 999;
  105. top: 50%;
  106. margin-top: -40px;
  107. }
  108. .imgBtn {
  109. position: absolute;
  110. width: 100%;
  111. padding: 10px;
  112. bottom: 0;
  113. left: 0;
  114. text-align: center;
  115. color: #338cd9;
  116. font-size: 16px;
  117. box-sizing: border-box;
  118. display: flex;
  119. justify-content: center;
  120. gap: 16px;
  121. }
  122. .imgBtn div {
  123. /* padding: 0 16px; */
  124. }
  125. .imgBtn img {
  126. display: inline-block;
  127. width: 20px;
  128. height: 20px;
  129. vertical-align: middle;
  130. margin-right: 2px;
  131. margin-bottom: 3px;
  132. }
  133. .imgBtnDgp {
  134. display: none;
  135. }
  136. #myCanvas{
  137. display: none;
  138. }
  139. </style>
  140. </head>
  141. <body>
  142. <div class="btn-container">
  143. <div id="box">
  144. </div>
  145. <div class="videoBtnPlay">
  146. <img src="https://webstaticimg.oss-cn-hangzhou.aliyuncs.com/bigdata_app/img/wxplayer.png" />
  147. </div>
  148. </div>
  149. <div id="dialog">
  150. </div>
  151. <canvas id="myCanvas" width="400" height="300"></canvas>
  152. <div class="btn-box">
  153. <div class="more" ontouchstart="_configCamera('move', 8)" ontouchend="_stopConfigCamera()">
  154. <image src="https://s3.hnyfwlw.com/webstaticimg/bigdata_app/image/monitor/3.png" mode="widthFix">
  155. </image>
  156. </div>
  157. <div class="direc">
  158. <div class="top" ontouchstart="_configCamera('move', 0)" ontouchend="_stopConfigCamera()">
  159. </div>
  160. <div class="bottom" ontouchstart="_configCamera('move', 1)" ontouchend="_stopConfigCamera()">
  161. </div>
  162. <p class="photo yficonfont icon-paizhao-xianxing" ontouchstart="_configCamera('takephoto', '')">
  163. </p>
  164. <div class="left" ontouchstart="_configCamera('move', 2)" ontouchend="_stopConfigCamera()">
  165. </div>
  166. <div class="right" ontouchstart="_configCamera('move', 3)" ontouchend="_stopConfigCamera()">
  167. </div>
  168. </div>
  169. <div class="less" ontouchstart="_configCamera('move', 9)" ontouchend="_stopConfigCamera()">
  170. <image src="https://s3.hnyfwlw.com/webstaticimg/bigdata_app/image/monitor/2.png" mode="widthFix">
  171. </image>
  172. </div>
  173. </div>
  174. <div class="imgBtn">
  175. <div class="imgBtnCamrea"> <img
  176. src="https://webstaticimg.oss-cn-hangzhou.aliyuncs.com/bigdata_app/img/img_icon.png" />查看图片</div>
  177. <div class="imgBtnDgp"><img
  178. src="https://webstaticimg.oss-cn-hangzhou.aliyuncs.com/bigdata_app/img/img_icon.png" />查看光谱图片</div>
  179. </div>
  180. </body>
  181. <!-- <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> -->
  182. <!-- 微信 JS-SDK 如果不需要兼容小程序,则无需引用此 JS 文件。 -->
  183. <!-- <script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.4.0.js"></script> -->
  184. <!-- uni 的 SDK -->
  185. <!-- <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script> -->
  186. <script src="./jquery-3.5.1.min.js"></script>
  187. <!-- <script src="https://unpkg.com/video.js@7.10.2/dist/video.min.js"></script> -->
  188. <script type="text/javascript" src="./jweixin-1.6.0.js"></script>
  189. <!-- uni 的 SDK -->
  190. <script type="text/javascript" src="./uni.webview.1.5.6.js" defer></script>
  191. <script src="./video.min.js"></script>
  192. <!-- <script src="./js/flv.min.js"></script> -->
  193. <script >
  194. // import Player from './videoPlayer/videoPlay-js.js'
  195. const domin = 'https://wx.hnyfwlw.com'
  196. // const domin = 'http://218.28.198.186:10508'
  197. let player = null
  198. let stopTimer = 0
  199. //上下左右和拍照
  200. var str = window.location.search.substr(1)
  201. var arr = str.split('&')
  202. console.log(str, arr, '参数');
  203. var device_id = arr[0].split('=')[1]
  204. var accessToken = arr[1].slice(12)
  205. var videoType = arr[2]?.split('=')[1]
  206. var token = accessToken
  207. window._configCamera = configCamera;
  208. window._stopConfigCamera = stopConfigCamera;
  209. window._postPic = postPic;
  210. if (videoType == 'dgp') {
  211. $('.imgBtnDgp').show()
  212. } else {
  213. $('.imgBtnDgp').hide()
  214. }
  215. function captureFrame() {
  216. const video = document.getElementById('myPlayer_html5_api');
  217. const canvas = document.getElementById('myCanvas');
  218. const ctx = canvas.getContext('2d');
  219. // 设置 canvas 尺寸与视频一致
  220. canvas.width = video.videoWidth;
  221. canvas.height = video.videoHeight;
  222. console.log(ctx,'---')
  223. // 绘制当前帧到 canvas
  224. ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
  225. // 获取图片数据
  226. const imageData = canvas.toDataURL('image/jpg');
  227. canvas.toBlob((blob)=>{
  228. postPic(blob)
  229. }, 'image/jpg', 0.92);
  230. // postPic(imageData)
  231. // // 可以创建图片显示或下载
  232. // const img = new Image();
  233. // img.src = imageData;
  234. // document.body.appendChild(img);
  235. // // 或者下载图片
  236. // downloadImage(imageData, 'captured-frame.png');
  237. }
  238. function initFlvPlayer(hlsHdSrc) {
  239. var playHtml =
  240. `<video width="100%" height="300px" id="huifangPlayer" controls autoplay muted></video>`;
  241. $("#box").html(playHtml)
  242. const container = document.getElementById('huifangPlayer')
  243. if (flvjs.isSupported()) {
  244. // console.log(videoElement);
  245. // let hlsHdSrc =
  246. // 'https://cmgw-vpc.lechange.com:8890/flv/LCO/BE049D6PAJ704F1/0/1/20251126103056/openhze749205130814fecba32ac68f5d30fe0.flv?proto=https&source=open';
  247. // 创建 FLV 播放器实例
  248. player = flvjs.createPlayer({
  249. type: 'flv', // 设置视频类型为 FLV
  250. isLive: true, // 指定这是点播
  251. hasAudio: false, // 指定视频流中没有音频
  252. url: hlsHdSrc
  253. })
  254. // 将播放器绑定到 HTML 视频元素
  255. player.attachMediaElement(container)
  256. // 加载视频流
  257. player.load()
  258. // 播放视频
  259. player.play()
  260. }
  261. }
  262. function destroyPlayer() {
  263. if (player) {
  264. const container = document.getElementById('huifangPlayer')
  265. player.pause()
  266. player.unload()
  267. player.detachMediaElement()
  268. player.destroy()
  269. player = null
  270. player = ''
  271. }
  272. }
  273. function configCamera(ctrl, movenum) {
  274. if (ctrl == "takephoto") {
  275. if (player) {
  276. // 云联的拍照特殊处理
  277. // player.screenshot('yunlianPlayer')
  278. $('#dialog').html('拍照指令正在下发,请等待...').stop().show(50)
  279. captureFrame()
  280. } else {
  281. $('#dialog').html('拍照指令正在下发,请等待...').stop().show(50)
  282. let url = domin+"/api/api_gateway?method=camera.camera_manage.camera_takephoto"
  283. if (videoType == 'dgp') {
  284. url = domin+"/api/api_gateway?method=camera.camera_manage.multi_camera_takephoto"
  285. }
  286. $.ajax({
  287. type: "POST",
  288. url: url,
  289. data: {
  290. device_id: device_id,
  291. token
  292. }
  293. }).then((res) => {
  294. if (res.message == '') {
  295. $('#dialog').html('拍照成功').stop().show(500).delay(1000).hide(500)
  296. } else {
  297. $('#dialog').html(res.message).stop().show(500).delay(1000).hide(500)
  298. }
  299. });
  300. }
  301. } else {
  302. let url = domin+"/api/api_gateway?method=camera.camera_manage.ctrl_camera"
  303. let postData = {
  304. device_id: device_id,
  305. token
  306. }
  307. if (videoType == 'dgp') {
  308. url = domin+"/api/api_gateway?method=camera.camera_manage.multi_ctrl_camera"
  309. postData.ctrl = movenum
  310. } else {
  311. postData.ctrl = ctrl
  312. postData.movenum = movenum
  313. }
  314. //上下左右、放大、缩小
  315. $.ajax({
  316. type: "POST",
  317. url: url,
  318. data: postData
  319. }).then((res) => {
  320. $('#dialog').html('指令下发成功,请等待...').stop().show(500).delay(3000).hide(500)
  321. })
  322. }
  323. }
  324. function stopConfigCamera() {
  325. if (player) {
  326. // 云联不需要停止
  327. return
  328. }
  329. if (videoType == 'dgp') {
  330. if (stopTimer) clearTimeout(stopTimer)
  331. stopTimer = setTimeout(() => {
  332. $.ajax({
  333. type: "POST",
  334. url: domin+"/api/api_gateway?method=camera.camera_manage.mulit_stop_move",
  335. data: {
  336. device_id: device_id,
  337. token
  338. },
  339. });
  340. }, 3000)
  341. } else {
  342. $.ajax({
  343. type: "POST",
  344. url: domin+"/api/api_gateway?method=camera.camera_manage.ctrl_camera",
  345. data: {
  346. device_id: device_id,
  347. ctrl: "stop",
  348. token
  349. },
  350. });
  351. }
  352. }
  353. function postPic(file) {
  354. let form = new FormData()
  355. form.append('img_file', file)
  356. form.append('device_id', device_id)
  357. form.append('token', token)
  358. $.ajax({
  359. type: "POST",
  360. url: domin+"/api/api_gateway?method=camera.camera_manage.save_camera_photo",
  361. contentType: false,
  362. processData: false,
  363. data: form
  364. }).then((res) => {
  365. if (res.message == '') {
  366. $('#dialog').html('拍照成功').stop().show(500).delay(1500).hide(500)
  367. } else {
  368. $('#dialog').html(res.message).stop().show(500).delay(1500).hide(500)
  369. }
  370. });
  371. }
  372. $('.videoBtnPlay').click(function() {
  373. $('.videoBtnPlay').hide()
  374. if (videoType == 'dgp') {
  375. $.ajax({
  376. type: "POST",
  377. url: domin+"/api/api_gateway?method=camera.camera_manage.multi_addr_camera",
  378. data: {
  379. device_id: device_id,
  380. token
  381. }
  382. }).then((res) => {
  383. // console.log(JSON.stringify(res))
  384. if (res.message == '') {
  385. var data = null
  386. if (typeof res.data == 'string') {
  387. data = eval('(' + res.data + ')');
  388. } else {
  389. data = res.data;
  390. }
  391. console.log(data, 'data');
  392. let hlsHdSrc = data.rtmp;
  393. var playHtml =
  394. `<video id="myPlayer" poster='' controls playsInline webkit-playsinline src=${hlsHdSrc} style="width:100%; height:100%;"></video>`;
  395. $("#box").html(playHtml)
  396. var myVideo = videojs(`myPlayer`, {
  397. controls: true,
  398. autoplay: 'play',
  399. url: hlsHdSrc,
  400. sources: [{
  401. type: 'application/x-mpegURL',
  402. src: hlsHdSrc,
  403. }],
  404. }, function onPlayerReady() {
  405. myVideo.play()
  406. console.log('准备好了')
  407. });
  408. myVideo.on('play', function() {
  409. console.log('开始播放')
  410. })
  411. } else {
  412. alert(res.message)
  413. }
  414. })
  415. } else {
  416. $.ajax({
  417. type: "POST",
  418. url: domin+"/api/api_gateway?method=camera.camera_manage.addr_camera",
  419. // url: "http://192.168.0.117:8003/api/api_gateway?method=camera.camera_manage.addr_camera",
  420. data: {
  421. device_id: device_id,
  422. is_dahua_app:'1',
  423. token
  424. // device_id: 'FA8690323-1',
  425. // token: localStorage.getItem('session_key')
  426. }
  427. }).then((res) => {
  428. if (res.message == '') {
  429. var data = null
  430. if (typeof res.data == 'string') {
  431. data = eval('(' + res.data + ')');
  432. } else {
  433. data = res.data;
  434. }
  435. var hlsHdSrc = ""
  436. if (data.type_id == 2) {
  437. // 大华云联
  438. // initFlvPlayer(data.rtsp)
  439. player = 1
  440. hlsHdSrc = data.rtsp;
  441. } else {
  442. hlsHdSrc = data.type_id == 0 ? data.hls : data.hlsHd;
  443. }
  444. var playHtml =
  445. `<video id="myPlayer" poster='' controls playsInline webkit-playsinline src=${hlsHdSrc} style="width:100%; height:100%;"></video>`;
  446. $("#box").html(playHtml)
  447. var myVideo = videojs(`myPlayer`, {
  448. controls: true,
  449. autoplay: 'play',
  450. url: hlsHdSrc,
  451. sources: [{
  452. type: 'application/x-mpegURL',
  453. src: hlsHdSrc,
  454. }],
  455. }, function onPlayerReady() {
  456. myVideo.play()
  457. console.log('准备好了')
  458. });
  459. myVideo.on('play', function() {
  460. console.log('开始播放')
  461. })
  462. } else {
  463. alert(res.message)
  464. }
  465. })
  466. }
  467. })
  468. document.addEventListener('UniAppJSBridgeReady', function() {
  469. $('.imgBtnCamrea').click(function() {
  470. // if (player) {
  471. // player.close('yunlianPlayer')
  472. // player = null
  473. // }
  474. uni.navigateTo({
  475. url: '/pages/monitor/imagelist?id=' + device_id
  476. })
  477. })
  478. $('.imgBtnDgp').click(function() {
  479. // if (player) {
  480. // player.close('yunlianPlayer')
  481. // player = null
  482. // }
  483. uni.navigateTo({
  484. url: '/pages/monitor/dgpImagelist?id=' + device_id
  485. })
  486. })
  487. });
  488. </script>
  489. </html>