From c226deacff2135751247d2e31d7e12c8b6db5314 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 07 二月 2023 10:04:15 +0800
Subject: [PATCH] 修复语音对讲发送页

---
 web_src/src/components/dialog/devicePlayer.vue | 1495 ++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 812 insertions(+), 683 deletions(-)

diff --git a/web_src/src/components/dialog/devicePlayer.vue b/web_src/src/components/dialog/devicePlayer.vue
index b49a188..59e0ee3 100644
--- a/web_src/src/components/dialog/devicePlayer.vue
+++ b/web_src/src/components/dialog/devicePlayer.vue
@@ -1,251 +1,321 @@
 <template>
-<div id="devicePlayer" v-loading="isLoging">
+  <div id="devicePlayer" v-loading="isLoging">
 
     <el-dialog title="瑙嗛鎾斁" top="0" :close-on-click-modal="false" :visible.sync="showVideoDialog" @close="close()">
       <div style="width: 100%; height: 100%">
-        <el-tabs type="card" :stretch="true" v-model="activePlayer" @tab-click="changePlayer" v-if="Object.keys(this.player).length > 1">
+        <el-tabs type="card" :stretch="true" v-model="activePlayer" @tab-click="changePlayer"
+                 v-if="Object.keys(this.player).length > 1">
           <el-tab-pane label="Jessibuca" name="jessibuca">
-            <jessibucaPlayer v-if="activePlayer === 'jessibuca'" ref="jessibuca" :visible.sync="showVideoDialog" :videoUrl="videoUrl" :error="videoError" :message="videoError" height="100px" :hasAudio="hasAudio" fluent autoplay live ></jessibucaPlayer>
+            <jessibucaPlayer v-if="activePlayer === 'jessibuca'" ref="jessibuca" :visible.sync="showVideoDialog"
+                             :videoUrl="videoUrl" :error="videoError" :message="videoError" height="100px"
+                             :hasAudio="hasAudio" fluent autoplay live></jessibucaPlayer>
           </el-tab-pane>
           <el-tab-pane label="WebRTC" name="webRTC">
-            <rtc-player v-if="activePlayer === 'webRTC'" ref="webRTC" :visible.sync="showVideoDialog" :videoUrl="videoUrl" :error="videoError" :message="videoError" height="100px" :hasAudio="hasAudio" fluent autoplay live ></rtc-player>
+            <rtc-player v-if="activePlayer === 'webRTC'" ref="webRTC" :visible.sync="showVideoDialog"
+                        :videoUrl="videoUrl" :error="videoError" :message="videoError" height="100px"
+                        :hasAudio="hasAudio" fluent autoplay live></rtc-player>
           </el-tab-pane>
           <el-tab-pane label="h265web">h265web鏁鏈熷緟</el-tab-pane>
           <el-tab-pane label="wsPlayer">wsPlayer 鏁鏈熷緟</el-tab-pane>
         </el-tabs>
-        <jessibucaPlayer v-if="Object.keys(this.player).length == 1 && this.player.jessibuca" ref="jessibuca" :visible.sync="showVideoDialog" :videoUrl="videoUrl" :error="videoError" :message="videoError" height="100px" :hasAudio="hasAudio" fluent autoplay live ></jessibucaPlayer>
-        <rtc-player v-if="Object.keys(this.player).length == 1 && this.player.webRTC" ref="jessibuca" :visible.sync="showVideoDialog" :videoUrl="videoUrl" :error="videoError" :message="videoError" height="100px" :hasAudio="hasAudio" fluent autoplay live ></rtc-player>
+        <jessibucaPlayer v-if="Object.keys(this.player).length == 1 && this.player.jessibuca" ref="jessibuca"
+                         :visible.sync="showVideoDialog" :videoUrl="videoUrl" :error="videoError" :message="videoError"
+                         height="100px" :hasAudio="hasAudio" fluent autoplay live></jessibucaPlayer>
+        <rtc-player v-if="Object.keys(this.player).length == 1 && this.player.webRTC" ref="jessibuca"
+                    :visible.sync="showVideoDialog" :videoUrl="videoUrl" :error="videoError" :message="videoError"
+                    height="100px" :hasAudio="hasAudio" fluent autoplay live></rtc-player>
 
       </div>
-        <div id="shared" style="text-align: right; margin-top: 1rem;">
-            <el-tabs v-model="tabActiveName" @tab-click="tabHandleClick" >
-                <el-tab-pane label="瀹炴椂瑙嗛" name="media">
-                    <div style="display: flex; margin-bottom: 0.5rem; height: 2.5rem;">
-                        <span style="width: 5rem; line-height: 2.5rem; text-align: right;">鎾斁鍦板潃锛�</span>
-                        <el-input v-model="getPlayerShared.sharedUrl" :disabled="true" >
-                          <template slot="append">
-                            <i class="cpoy-btn el-icon-document-copy"  title="鐐瑰嚮鎷疯礉" v-clipboard="getPlayerShared.sharedUrl" @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})"></i>
-                          </template>
-                        </el-input>
-                    </div>
-                    <div style="display: flex; margin-bottom: 0.5rem; height: 2.5rem;">
-                        <span style="width: 5rem; line-height: 2.5rem; text-align: right;">iframe锛�</span>
-                        <el-input v-model="getPlayerShared.sharedIframe" :disabled="true" >
-                          <template slot="append">
-                            <i class="cpoy-btn el-icon-document-copy"  title="鐐瑰嚮鎷疯礉" v-clipboard="getPlayerShared.sharedIframe" @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})"></i>
-                          </template>
-                        </el-input>
-                    </div>
-                    <div style="display: flex; margin-bottom: 0.5rem; height: 2.5rem;">
-                        <span style="width: 5rem; line-height: 2.5rem; text-align: right;">璧勬簮鍦板潃锛�</span>
-                        <el-input v-model="getPlayerShared.sharedRtmp" :disabled="true" >
-                          <el-button slot="append" icon="el-icon-document-copy" title="鐐瑰嚮鎷疯礉" v-clipboard="getPlayerShared.sharedRtmp" @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})"></el-button>
-                            <el-dropdown slot="prepend" v-if="streamInfo" trigger="click" @command="copyUrl">
-                              <el-button >
-                                鏇村鍦板潃<i class="el-icon-arrow-down el-icon--right"></i>
-                              </el-button>
-                              <el-dropdown-menu slot="dropdown" >
-                                <el-dropdown-item v-if="streamInfo.flv" :command="streamInfo.flv">
-                                  <el-tag >FLV:</el-tag>
-                                  <span>{{ streamInfo.flv }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.https_flv" :command="streamInfo.https_flv">
-                                  <el-tag >FLV(https):</el-tag>
-                                  <span>{{ streamInfo.https_flv }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.ws_flv" :command="streamInfo.ws_flv">
-                                  <el-tag  >FLV(ws):</el-tag>
-                                  <span >{{ streamInfo.ws_flv }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.wss_flv" :command="streamInfo.wss_flv">
-                                  <el-tag  >FLV(wss):</el-tag>
-                                  <span>{{ streamInfo.wss_flv }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.fmp4" :command="streamInfo.fmp4">
-                                  <el-tag >FMP4:</el-tag>
-                                  <span>{{ streamInfo.fmp4 }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.https_fmp4" :command="streamInfo.https_fmp4">
-                                  <el-tag >FMP4(https):</el-tag>
-                                  <span>{{ streamInfo.https_fmp4 }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.ws_fmp4" :command="streamInfo.ws_fmp4">
-                                  <el-tag >FMP4(ws):</el-tag>
-                                  <span>{{ streamInfo.ws_fmp4 }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.wss_fmp4" :command="streamInfo.wss_fmp4">
-                                  <el-tag >FMP4(wss):</el-tag>
-                                  <span>{{ streamInfo.wss_fmp4 }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.hls" :command="streamInfo.hls">
-                                  <el-tag>HLS:</el-tag>
-                                  <span>{{ streamInfo.hls }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.https_hls" :command="streamInfo.https_hls">
-                                  <el-tag >HLS(https):</el-tag>
-                                  <span>{{ streamInfo.https_hls }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.ws_hls" :command="streamInfo.ws_hls">
-                                  <el-tag >HLS(ws):</el-tag>
-                                  <span>{{ streamInfo.ws_hls }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.wss_hls"  :command="streamInfo.wss_hls">
-                                  <el-tag >HLS(wss):</el-tag>
-                                  <span>{{ streamInfo.wss_hls }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.ts"  :command="streamInfo.ts">
-                                  <el-tag>TS:</el-tag>
-                                  <span>{{ streamInfo.ts }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.https_ts" :command="streamInfo.https_ts">
-                                  <el-tag>TS(https):</el-tag>
-                                  <span>{{ streamInfo.https_ts }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.ws_ts" :command="streamInfo.ws_ts">
-                                  <el-tag>TS(ws):</el-tag>
-                                  <span>{{ streamInfo.ws_ts }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.wss_ts" :command="streamInfo.wss_ts">
-                                  <el-tag>TS(wss):</el-tag>
-                                  <span>{{ streamInfo.wss_ts }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.rtc" :command="streamInfo.rtc">
-                                  <el-tag >RTC:</el-tag>
-                                  <span>{{ streamInfo.rtc }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.rtcs" :command="streamInfo.rtcs">
-                                  <el-tag >RTCS:</el-tag>
-                                  <span>{{ streamInfo.rtcs }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.rtmp" :command="streamInfo.rtmp">
-                                  <el-tag >RTMP:</el-tag>
-                                  <span>{{ streamInfo.rtmp }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.rtmps" :command="streamInfo.rtmps">
-                                  <el-tag >RTMPS:</el-tag>
-                                  <span>{{ streamInfo.rtmps }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.rtsp" :command="streamInfo.rtsp">
-                                  <el-tag >RTSP:</el-tag>
-                                  <span>{{ streamInfo.rtsp }}</span>
-                                </el-dropdown-item>
-                                <el-dropdown-item v-if="streamInfo.rtsps" :command="streamInfo.rtsps">
-                                  <el-tag >RTSPS:</el-tag>
-                                  <span>{{ streamInfo.rtsps }}</span>
-                                </el-dropdown-item>
-                              </el-dropdown-menu>
-                            </el-dropdown>
-                        </el-input>
+      <div id="shared" style="text-align: right; margin-top: 1rem;">
+        <el-tabs v-model="tabActiveName" @tab-click="tabHandleClick">
+          <el-tab-pane label="瀹炴椂瑙嗛" name="media">
+            <div style="display: flex; margin-bottom: 0.5rem; height: 2.5rem;">
+              <span style="width: 5rem; line-height: 2.5rem; text-align: right;">鎾斁鍦板潃锛�</span>
+              <el-input v-model="getPlayerShared.sharedUrl" :disabled="true">
+                <template slot="append">
+                  <i class="cpoy-btn el-icon-document-copy" title="鐐瑰嚮鎷疯礉" v-clipboard="getPlayerShared.sharedUrl"
+                     @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})"></i>
+                </template>
+              </el-input>
+            </div>
+            <div style="display: flex; margin-bottom: 0.5rem; height: 2.5rem;">
+              <span style="width: 5rem; line-height: 2.5rem; text-align: right;">iframe锛�</span>
+              <el-input v-model="getPlayerShared.sharedIframe" :disabled="true">
+                <template slot="append">
+                  <i class="cpoy-btn el-icon-document-copy" title="鐐瑰嚮鎷疯礉" v-clipboard="getPlayerShared.sharedIframe"
+                     @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})"></i>
+                </template>
+              </el-input>
+            </div>
+            <div style="display: flex; margin-bottom: 0.5rem; height: 2.5rem;">
+              <span style="width: 5rem; line-height: 2.5rem; text-align: right;">璧勬簮鍦板潃锛�</span>
+              <el-input v-model="getPlayerShared.sharedRtmp" :disabled="true">
+                <el-button slot="append" icon="el-icon-document-copy" title="鐐瑰嚮鎷疯礉"
+                           v-clipboard="getPlayerShared.sharedRtmp"
+                           @success="$message({type:'success', message:'鎴愬姛鎷疯礉鍒扮矘璐存澘'})"></el-button>
+                <el-dropdown slot="prepend" v-if="streamInfo" trigger="click" @command="copyUrl">
+                  <el-button>
+                    鏇村鍦板潃<i class="el-icon-arrow-down el-icon--right"></i>
+                  </el-button>
+                  <el-dropdown-menu slot="dropdown">
+                    <el-dropdown-item v-if="streamInfo.flv" :command="streamInfo.flv">
+                      <el-tag>FLV:</el-tag>
+                      <span>{{ streamInfo.flv }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.https_flv" :command="streamInfo.https_flv">
+                      <el-tag>FLV(https):</el-tag>
+                      <span>{{ streamInfo.https_flv }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.ws_flv" :command="streamInfo.ws_flv">
+                      <el-tag>FLV(ws):</el-tag>
+                      <span>{{ streamInfo.ws_flv }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.wss_flv" :command="streamInfo.wss_flv">
+                      <el-tag>FLV(wss):</el-tag>
+                      <span>{{ streamInfo.wss_flv }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.fmp4" :command="streamInfo.fmp4">
+                      <el-tag>FMP4:</el-tag>
+                      <span>{{ streamInfo.fmp4 }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.https_fmp4" :command="streamInfo.https_fmp4">
+                      <el-tag>FMP4(https):</el-tag>
+                      <span>{{ streamInfo.https_fmp4 }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.ws_fmp4" :command="streamInfo.ws_fmp4">
+                      <el-tag>FMP4(ws):</el-tag>
+                      <span>{{ streamInfo.ws_fmp4 }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.wss_fmp4" :command="streamInfo.wss_fmp4">
+                      <el-tag>FMP4(wss):</el-tag>
+                      <span>{{ streamInfo.wss_fmp4 }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.hls" :command="streamInfo.hls">
+                      <el-tag>HLS:</el-tag>
+                      <span>{{ streamInfo.hls }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.https_hls" :command="streamInfo.https_hls">
+                      <el-tag>HLS(https):</el-tag>
+                      <span>{{ streamInfo.https_hls }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.ws_hls" :command="streamInfo.ws_hls">
+                      <el-tag>HLS(ws):</el-tag>
+                      <span>{{ streamInfo.ws_hls }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.wss_hls" :command="streamInfo.wss_hls">
+                      <el-tag>HLS(wss):</el-tag>
+                      <span>{{ streamInfo.wss_hls }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.ts" :command="streamInfo.ts">
+                      <el-tag>TS:</el-tag>
+                      <span>{{ streamInfo.ts }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.https_ts" :command="streamInfo.https_ts">
+                      <el-tag>TS(https):</el-tag>
+                      <span>{{ streamInfo.https_ts }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.ws_ts" :command="streamInfo.ws_ts">
+                      <el-tag>TS(ws):</el-tag>
+                      <span>{{ streamInfo.ws_ts }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.wss_ts" :command="streamInfo.wss_ts">
+                      <el-tag>TS(wss):</el-tag>
+                      <span>{{ streamInfo.wss_ts }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.rtc" :command="streamInfo.rtc">
+                      <el-tag>RTC:</el-tag>
+                      <span>{{ streamInfo.rtc }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.rtcs" :command="streamInfo.rtcs">
+                      <el-tag>RTCS:</el-tag>
+                      <span>{{ streamInfo.rtcs }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.rtmp" :command="streamInfo.rtmp">
+                      <el-tag>RTMP:</el-tag>
+                      <span>{{ streamInfo.rtmp }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.rtmps" :command="streamInfo.rtmps">
+                      <el-tag>RTMPS:</el-tag>
+                      <span>{{ streamInfo.rtmps }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.rtsp" :command="streamInfo.rtsp">
+                      <el-tag>RTSP:</el-tag>
+                      <span>{{ streamInfo.rtsp }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item v-if="streamInfo.rtsps" :command="streamInfo.rtsps">
+                      <el-tag>RTSPS:</el-tag>
+                      <span>{{ streamInfo.rtsps }}</span>
+                    </el-dropdown-item>
+                  </el-dropdown-menu>
+                </el-dropdown>
+              </el-input>
 
-                    </div>
-                </el-tab-pane>
-                <!--{"code":0,"data":{"paths":["22-29-30.mp4"],"rootPath":"/home/kkkkk/Documents/ZLMediaKit/release/linux/Debug/www/record/hls/kkkkk/2020-05-11/"}}-->
-                <!--閬ユ帶鐣岄潰-->
-                <el-tab-pane label="浜戝彴鎺у埗" name="control" v-if="showPtz">
-                    <div style="display: flex; justify-content: left;">
-                        <div class="control-wrapper">
-                            <div class="control-btn control-top" @mousedown="ptzCamera('up')" @mouseup="ptzCamera('stop')">
-                                <i class="el-icon-caret-top"></i>
-                                <div class="control-inner-btn control-inner"></div>
-                            </div>
-                            <div class="control-btn control-left" @mousedown="ptzCamera('left')" @mouseup="ptzCamera('stop')">
-                                <i class="el-icon-caret-left"></i>
-                                <div class="control-inner-btn control-inner"></div>
-                            </div>
-                            <div class="control-btn control-bottom" @mousedown="ptzCamera('down')" @mouseup="ptzCamera('stop')">
-                                <i class="el-icon-caret-bottom"></i>
-                                <div class="control-inner-btn control-inner"></div>
-                            </div>
-                            <div class="control-btn control-right" @mousedown="ptzCamera('right')" @mouseup="ptzCamera('stop')">
-                                <i class="el-icon-caret-right"></i>
-                                <div class="control-inner-btn control-inner"></div>
-                            </div>
-                            <div class="control-round">
-                                <div class="control-round-inner"><i class="fa fa-pause-circle"></i></div>
-                            </div>
-                            <div style="position: absolute; left: 7.25rem; top: 1.25rem" @mousedown="ptzCamera('zoomin')" @mouseup="ptzCamera('stop')"><i class="el-icon-zoom-in control-zoom-btn" style="font-size: 1.875rem;"></i></div>
-                            <div style="position: absolute; left: 7.25rem; top: 3.25rem; font-size: 1.875rem;" @mousedown="ptzCamera('zoomout')" @mouseup="ptzCamera('stop')"><i class="el-icon-zoom-out control-zoom-btn"></i></div>
-                             <div class="contro-speed" style="position: absolute; left: 4px; top: 7rem; width: 9rem;">
-                                 <el-slider v-model="controSpeed" :max="255"></el-slider>
-                             </div>
-                        </div>
-
-                        <div class="control-panel">
-                            <el-button-group>
-                                <el-tag style="position :absolute; left: 0rem; top: 0rem; width: 5rem; text-align: center" size="medium">棰勭疆浣嶇紪鍙�</el-tag>
-                                <el-input-number style="position: absolute; left: 5rem; top: 0rem; width: 6rem" size="mini" v-model="presetPos" controls-position="right" :precision="0" :step="1" :min="1" :max="255"></el-input-number>
-                                <el-button style="position: absolute; left: 11rem; top: 0rem; width: 5rem" size="mini" icon="el-icon-add-location" @click="presetPosition(129, presetPos)">璁剧疆</el-button>
-                                <el-button style="position: absolute; left: 27rem; top: 0rem; width: 5rem" size="mini" type="primary" icon="el-icon-place" @click="presetPosition(130, presetPos)">璋冪敤</el-button>
-                                <el-button style="position: absolute; left: 16rem; top: 0rem; width: 5rem" size="mini" icon="el-icon-delete-location" @click="presetPosition(131, presetPos)">鍒犻櫎</el-button>
-                                <el-tag style="position :absolute; left: 0rem; top: 2.5rem; width: 5rem; text-align: center" size="medium">宸¤埅閫熷害</el-tag>
-                                <el-input-number style="position: absolute; left: 5rem; top: 2.5rem; width: 6rem" size="mini" v-model="cruisingSpeed" controls-position="right" :precision="0" :min="1" :max="4095"></el-input-number>
-                                <el-button style="position: absolute; left: 11rem; top: 2.5rem; width: 5rem" size="mini" icon="el-icon-loading" @click="setSpeedOrTime(134, cruisingGroup, cruisingSpeed)">璁剧疆</el-button>
-                                <el-tag style="position :absolute; left: 16rem; top: 2.5rem; width: 5rem; text-align: center" size="medium">鍋滅暀鏃堕棿</el-tag>
-                                <el-input-number style="position: absolute; left: 21rem; top: 2.5rem; width: 6rem" size="mini" v-model="cruisingTime" controls-position="right" :precision="0" :min="1" :max="4095"></el-input-number>
-                                <el-button style="position: absolute; left: 27rem; top: 2.5rem; width: 5rem" size="mini" icon="el-icon-timer" @click="setSpeedOrTime(135, cruisingGroup, cruisingTime)">璁剧疆</el-button>
-                                <el-tag style="position :absolute; left: 0rem; top: 4.5rem; width: 5rem; text-align: center" size="medium">宸¤埅缁勭紪鍙�</el-tag>
-                                <el-input-number style="position: absolute; left: 5rem; top: 4.5rem; width: 6rem" size="mini" v-model="cruisingGroup" controls-position="right" :precision="0" :min="0" :max="255"></el-input-number>
-                                <el-button style="position: absolute; left: 11rem; top: 4.5rem; width: 5rem" size="mini" icon="el-icon-add-location" @click="setCommand(132, cruisingGroup, presetPos)">娣诲姞鐐�</el-button>
-                                <el-button style="position: absolute; left: 16rem; top: 4.5rem; width: 5rem" size="mini" icon="el-icon-delete-location" @click="setCommand(133, cruisingGroup, presetPos)">鍒犻櫎鐐�</el-button>
-                                <el-button style="position: absolute; left: 21rem; top: 4.5rem; width: 5rem" size="mini" icon="el-icon-delete" @click="setCommand(133, cruisingGroup, 0)">鍒犻櫎缁�</el-button>
-                                <el-button style="position: absolute; left: 27rem; top: 5rem; width: 5rem" size="mini" type="primary" icon="el-icon-video-camera-solid" @click="setCommand(136, cruisingGroup, 0)">宸¤埅</el-button>
-                                <el-tag style="position :absolute; left: 0rem; top: 7rem; width: 5rem; text-align: center" size="medium">鎵弿閫熷害</el-tag>
-                                <el-input-number style="position: absolute; left: 5rem; top: 7rem; width: 6rem" size="mini" v-model="scanSpeed" controls-position="right" :precision="0" :min="1" :max="4095"></el-input-number>
-                                <el-button style="position: absolute; left: 11rem; top: 7rem; width: 5rem" size="mini" icon="el-icon-loading" @click="setSpeedOrTime(138, scanGroup, scanSpeed)">璁剧疆</el-button>
-                                <el-tag style="position :absolute; left: 0rem; top: 9rem; width: 5rem; text-align: center" size="medium">鎵弿缁勭紪鍙�</el-tag>
-                                <el-input-number style="position: absolute; left: 5rem; top: 9rem; width: 6rem" size="mini" v-model="scanGroup" controls-position="right" :precision="0" :step="1" :min="0" :max="255"></el-input-number>
-                                <el-button style="position: absolute; left: 11rem; top: 9rem; width: 5rem" size="mini" icon="el-icon-d-arrow-left" @click="setCommand(137, scanGroup, 1)">宸﹁竟鐣�</el-button>
-                                <el-button style="position: absolute; left: 16rem; top: 9rem; width: 5rem" size="mini" icon="el-icon-d-arrow-right" @click="setCommand(137, scanGroup, 2)">鍙宠竟鐣�</el-button>
-                                <el-button style="position: absolute; left: 27rem; top: 7rem; width: 5rem" size="mini" type="primary" icon="el-icon-video-camera-solid" @click="setCommand(137, scanGroup, 0)">鎵弿</el-button>
-                                <el-button style="position: absolute; left: 27rem; top: 9rem; width: 5rem" size="mini" type="danger" icon="el-icon-switch-button" @click="ptzCamera('stop')">鍋滄</el-button>
-                            </el-button-group>
-                        </div>
-                    </div>
-                </el-tab-pane>
-                <el-tab-pane label="缂栫爜淇℃伅" name="codec" v-loading="tracksLoading">
-                    <p>
-                        鏃犳硶鎾斁鎴栬�呮病鏈夊0闊�?&nbsp&nbsp&nbsp璇曚竴璇�&nbsp
-                        <el-button size="mini" type="primary" v-if="!coverPlaying" @click="coverPlay">杞爜鎾斁</el-button>
-                        <el-button size="mini" type="danger" v-if="coverPlaying" @click="convertStopClick">鍋滄杞爜</el-button>
-                    </p>
-                    <div class="trank" >
-                      <p v-if="tracksNotLoaded" style="text-align: center;padding-top: 3rem;">鏆傛棤鏁版嵁</p>
-                        <div v-for="(item, index) in tracks" style="width: 50%; float: left" loading>
-                            <span >娴� {{index}}</span>
-                            <div class="trankInfo" v-if="item.codec_type == 0">
-                                <p>鏍煎紡: {{item.codec_id_name}}</p>
-                                <p>绫诲瀷: 瑙嗛</p>
-                                <p>鍒嗚鲸鐜�: {{item.width}} x {{item.height}}</p>
-                                <p>甯х巼: {{item.fps}}</p>
-                            </div>
-                            <div class="trankInfo" v-if="item.codec_type == 1">
-                                <p>鏍煎紡: {{item.codec_id_name}}</p>
-                                <p>绫诲瀷: 闊抽</p>
-                                <p>閲囨牱浣嶆暟: {{item.sample_bit}}</p>
-                                <p>閲囨牱鐜�: {{item.sample_rate}}</p>
-                            </div>
-                        </div>
-
-                    </div>
-
-                </el-tab-pane>
-              <el-tab-pane label="璇煶瀵硅" name="broadcast" >
-                <div class="trank" style="text-align: center;">
-                  <el-button @click="broadcastStatusClick()" :type="getBroadcastStatus()" :disabled="broadcastStatus === -2" circle icon="el-icon-microphone"  style="font-size: 32px; padding: 24px;margin-top: 24px;"/>
-                  <p>
-                    <span v-if="broadcastStatus === -2">姝e湪閲婃斁璧勬簮</span>
-                    <span v-if="broadcastStatus === -1">鐐瑰嚮寮�濮嬪璁�</span>
-                    <span v-if="broadcastStatus === 0">绛夊緟鎺ラ�氫腑...</span>
-                    <span v-if="broadcastStatus === 1">璇疯璇�</span>
-                  </p>
-
+            </div>
+          </el-tab-pane>
+          <!--{"code":0,"data":{"paths":["22-29-30.mp4"],"rootPath":"/home/kkkkk/Documents/ZLMediaKit/release/linux/Debug/www/record/hls/kkkkk/2020-05-11/"}}-->
+          <!--閬ユ帶鐣岄潰-->
+          <el-tab-pane label="浜戝彴鎺у埗" name="control" v-if="showPtz">
+            <div style="display: flex; justify-content: left;">
+              <div class="control-wrapper">
+                <div class="control-btn control-top" @mousedown="ptzCamera('up')" @mouseup="ptzCamera('stop')">
+                  <i class="el-icon-caret-top"></i>
+                  <div class="control-inner-btn control-inner"></div>
                 </div>
-              </el-tab-pane>
+                <div class="control-btn control-left" @mousedown="ptzCamera('left')" @mouseup="ptzCamera('stop')">
+                  <i class="el-icon-caret-left"></i>
+                  <div class="control-inner-btn control-inner"></div>
+                </div>
+                <div class="control-btn control-bottom" @mousedown="ptzCamera('down')" @mouseup="ptzCamera('stop')">
+                  <i class="el-icon-caret-bottom"></i>
+                  <div class="control-inner-btn control-inner"></div>
+                </div>
+                <div class="control-btn control-right" @mousedown="ptzCamera('right')" @mouseup="ptzCamera('stop')">
+                  <i class="el-icon-caret-right"></i>
+                  <div class="control-inner-btn control-inner"></div>
+                </div>
+                <div class="control-round">
+                  <div class="control-round-inner"><i class="fa fa-pause-circle"></i></div>
+                </div>
+                <div style="position: absolute; left: 7.25rem; top: 1.25rem" @mousedown="ptzCamera('zoomin')"
+                     @mouseup="ptzCamera('stop')"><i class="el-icon-zoom-in control-zoom-btn"
+                                                     style="font-size: 1.875rem;"></i></div>
+                <div style="position: absolute; left: 7.25rem; top: 3.25rem; font-size: 1.875rem;"
+                     @mousedown="ptzCamera('zoomout')" @mouseup="ptzCamera('stop')"><i
+                  class="el-icon-zoom-out control-zoom-btn"></i></div>
+                <div class="contro-speed" style="position: absolute; left: 4px; top: 7rem; width: 9rem;">
+                  <el-slider v-model="controSpeed" :max="255"></el-slider>
+                </div>
+              </div>
 
-            </el-tabs>
-        </div>
+              <div class="control-panel">
+                <el-button-group>
+                  <el-tag style="position :absolute; left: 0rem; top: 0rem; width: 5rem; text-align: center"
+                          size="medium">棰勭疆浣嶇紪鍙�
+                  </el-tag>
+                  <el-input-number style="position: absolute; left: 5rem; top: 0rem; width: 6rem" size="mini"
+                                   v-model="presetPos" controls-position="right" :precision="0" :step="1" :min="1"
+                                   :max="255"></el-input-number>
+                  <el-button style="position: absolute; left: 11rem; top: 0rem; width: 5rem" size="mini"
+                             icon="el-icon-add-location" @click="presetPosition(129, presetPos)">璁剧疆
+                  </el-button>
+                  <el-button style="position: absolute; left: 27rem; top: 0rem; width: 5rem" size="mini" type="primary"
+                             icon="el-icon-place" @click="presetPosition(130, presetPos)">璋冪敤
+                  </el-button>
+                  <el-button style="position: absolute; left: 16rem; top: 0rem; width: 5rem" size="mini"
+                             icon="el-icon-delete-location" @click="presetPosition(131, presetPos)">鍒犻櫎
+                  </el-button>
+                  <el-tag style="position :absolute; left: 0rem; top: 2.5rem; width: 5rem; text-align: center"
+                          size="medium">宸¤埅閫熷害
+                  </el-tag>
+                  <el-input-number style="position: absolute; left: 5rem; top: 2.5rem; width: 6rem" size="mini"
+                                   v-model="cruisingSpeed" controls-position="right" :precision="0" :min="1"
+                                   :max="4095"></el-input-number>
+                  <el-button style="position: absolute; left: 11rem; top: 2.5rem; width: 5rem" size="mini"
+                             icon="el-icon-loading" @click="setSpeedOrTime(134, cruisingGroup, cruisingSpeed)">璁剧疆
+                  </el-button>
+                  <el-tag style="position :absolute; left: 16rem; top: 2.5rem; width: 5rem; text-align: center"
+                          size="medium">鍋滅暀鏃堕棿
+                  </el-tag>
+                  <el-input-number style="position: absolute; left: 21rem; top: 2.5rem; width: 6rem" size="mini"
+                                   v-model="cruisingTime" controls-position="right" :precision="0" :min="1"
+                                   :max="4095"></el-input-number>
+                  <el-button style="position: absolute; left: 27rem; top: 2.5rem; width: 5rem" size="mini"
+                             icon="el-icon-timer" @click="setSpeedOrTime(135, cruisingGroup, cruisingTime)">璁剧疆
+                  </el-button>
+                  <el-tag style="position :absolute; left: 0rem; top: 4.5rem; width: 5rem; text-align: center"
+                          size="medium">宸¤埅缁勭紪鍙�
+                  </el-tag>
+                  <el-input-number style="position: absolute; left: 5rem; top: 4.5rem; width: 6rem" size="mini"
+                                   v-model="cruisingGroup" controls-position="right" :precision="0" :min="0"
+                                   :max="255"></el-input-number>
+                  <el-button style="position: absolute; left: 11rem; top: 4.5rem; width: 5rem" size="mini"
+                             icon="el-icon-add-location" @click="setCommand(132, cruisingGroup, presetPos)">娣诲姞鐐�
+                  </el-button>
+                  <el-button style="position: absolute; left: 16rem; top: 4.5rem; width: 5rem" size="mini"
+                             icon="el-icon-delete-location" @click="setCommand(133, cruisingGroup, presetPos)">鍒犻櫎鐐�
+                  </el-button>
+                  <el-button style="position: absolute; left: 21rem; top: 4.5rem; width: 5rem" size="mini"
+                             icon="el-icon-delete" @click="setCommand(133, cruisingGroup, 0)">鍒犻櫎缁�
+                  </el-button>
+                  <el-button style="position: absolute; left: 27rem; top: 5rem; width: 5rem" size="mini" type="primary"
+                             icon="el-icon-video-camera-solid" @click="setCommand(136, cruisingGroup, 0)">宸¤埅
+                  </el-button>
+                  <el-tag style="position :absolute; left: 0rem; top: 7rem; width: 5rem; text-align: center"
+                          size="medium">鎵弿閫熷害
+                  </el-tag>
+                  <el-input-number style="position: absolute; left: 5rem; top: 7rem; width: 6rem" size="mini"
+                                   v-model="scanSpeed" controls-position="right" :precision="0" :min="1"
+                                   :max="4095"></el-input-number>
+                  <el-button style="position: absolute; left: 11rem; top: 7rem; width: 5rem" size="mini"
+                             icon="el-icon-loading" @click="setSpeedOrTime(138, scanGroup, scanSpeed)">璁剧疆
+                  </el-button>
+                  <el-tag style="position :absolute; left: 0rem; top: 9rem; width: 5rem; text-align: center"
+                          size="medium">鎵弿缁勭紪鍙�
+                  </el-tag>
+                  <el-input-number style="position: absolute; left: 5rem; top: 9rem; width: 6rem" size="mini"
+                                   v-model="scanGroup" controls-position="right" :precision="0" :step="1" :min="0"
+                                   :max="255"></el-input-number>
+                  <el-button style="position: absolute; left: 11rem; top: 9rem; width: 5rem" size="mini"
+                             icon="el-icon-d-arrow-left" @click="setCommand(137, scanGroup, 1)">宸﹁竟鐣�
+                  </el-button>
+                  <el-button style="position: absolute; left: 16rem; top: 9rem; width: 5rem" size="mini"
+                             icon="el-icon-d-arrow-right" @click="setCommand(137, scanGroup, 2)">鍙宠竟鐣�
+                  </el-button>
+                  <el-button style="position: absolute; left: 27rem; top: 7rem; width: 5rem" size="mini" type="primary"
+                             icon="el-icon-video-camera-solid" @click="setCommand(137, scanGroup, 0)">鎵弿
+                  </el-button>
+                  <el-button style="position: absolute; left: 27rem; top: 9rem; width: 5rem" size="mini" type="danger"
+                             icon="el-icon-switch-button" @click="ptzCamera('stop')">鍋滄
+                  </el-button>
+                </el-button-group>
+              </div>
+            </div>
+          </el-tab-pane>
+          <el-tab-pane label="缂栫爜淇℃伅" name="codec" v-loading="tracksLoading">
+            <p>
+              鏃犳硶鎾斁鎴栬�呮病鏈夊0闊�?&nbsp&nbsp&nbsp璇曚竴璇�&nbsp
+              <el-button size="mini" type="primary" v-if="!coverPlaying" @click="coverPlay">杞爜鎾斁</el-button>
+              <el-button size="mini" type="danger" v-if="coverPlaying" @click="convertStopClick">鍋滄杞爜</el-button>
+            </p>
+            <div class="trank">
+              <p v-if="tracksNotLoaded" style="text-align: center;padding-top: 3rem;">鏆傛棤鏁版嵁</p>
+              <div v-for="(item, index) in tracks" style="width: 50%; float: left" loading>
+                <span>娴� {{ index }}</span>
+                <div class="trankInfo" v-if="item.codec_type == 0">
+                  <p>鏍煎紡: {{ item.codec_id_name }}</p>
+                  <p>绫诲瀷: 瑙嗛</p>
+                  <p>鍒嗚鲸鐜�: {{ item.width }} x {{ item.height }}</p>
+                  <p>甯х巼: {{ item.fps }}</p>
+                </div>
+                <div class="trankInfo" v-if="item.codec_type == 1">
+                  <p>鏍煎紡: {{ item.codec_id_name }}</p>
+                  <p>绫诲瀷: 闊抽</p>
+                  <p>閲囨牱浣嶆暟: {{ item.sample_bit }}</p>
+                  <p>閲囨牱鐜�: {{ item.sample_rate }}</p>
+                </div>
+              </div>
+
+            </div>
+
+          </el-tab-pane>
+          <el-tab-pane label="璇煶瀵硅" name="broadcast">
+            <div class="trank" style="text-align: center;">
+              <el-button @click="broadcastStatusClick()" :type="getBroadcastStatus()" :disabled="broadcastStatus === -2"
+                         circle icon="el-icon-microphone" style="font-size: 32px; padding: 24px;margin-top: 24px;"/>
+              <p>
+                <span v-if="broadcastStatus === -2">姝e湪閲婃斁璧勬簮</span>
+                <span v-if="broadcastStatus === -1">鐐瑰嚮寮�濮嬪璁�</span>
+                <span v-if="broadcastStatus === 0">绛夊緟鎺ラ�氫腑...</span>
+                <span v-if="broadcastStatus === 1">璇疯璇�</span>
+              </p>
+
+            </div>
+          </el-tab-pane>
+
+        </el-tabs>
+      </div>
     </el-dialog>
-</div>
+  </div>
 </template>
 
 <script>
@@ -253,561 +323,620 @@
 import LivePlayer from '@liveqing/liveplayer'
 import crypto from 'crypto'
 import jessibucaPlayer from '../common/jessibuca.vue'
+
 export default {
-    name: 'devicePlayer',
-    props: {},
-    components: {
-      LivePlayer, jessibucaPlayer, rtcPlayer,
-    },
-    computed: {
-        getPlayerShared: function () {
-            return {
-                sharedUrl: window.location.origin + '/#/play/wasm/' + encodeURIComponent(this.videoUrl),
-                sharedIframe: '<iframe src="' + window.location.origin + '/#/play/wasm/' + encodeURIComponent(this.videoUrl) + '"></iframe>',
-                sharedRtmp: this.videoUrl
-            };
-        }
-    },
-    created() {
-      console.log("created")
-      console.log(this.player)
-      this.broadcastStatus = -1;
-      if (Object.keys(this.player).length === 1) {
-        this.activePlayer = Object.keys(this.player)[0]
+  name: 'devicePlayer',
+  props: {},
+  components: {
+    LivePlayer, jessibucaPlayer, rtcPlayer,
+  },
+  computed: {
+    getPlayerShared: function () {
+      return {
+        sharedUrl: window.location.origin + '/#/play/wasm/' + encodeURIComponent(this.videoUrl),
+        sharedIframe: '<iframe src="' + window.location.origin + '/#/play/wasm/' + encodeURIComponent(this.videoUrl) + '"></iframe>',
+        sharedRtmp: this.videoUrl
+      };
+    }
+  },
+  created() {
+    console.log("created")
+    console.log(this.player)
+    this.broadcastStatus = -1;
+    if (Object.keys(this.player).length === 1) {
+      this.activePlayer = Object.keys(this.player)[0]
+    }
+  },
+  data() {
+    return {
+      video: 'http://lndxyj.iqilu.com/public/upload/2019/10/14/8c001ea0c09cdc59a57829dabc8010fa.mp4',
+      videoUrl: '',
+      activePlayer: "jessibuca",
+      // 濡備綍浣犲彧鏄敤涓�绉嶆挱鏀惧櫒锛岀洿鎺ユ敞閲婃帀涓嶇敤鐨勯儴鍒嗗嵆鍙�
+      player: {
+        jessibuca: ["ws_flv", "wss_flv"],
+        webRTC: ["rtc", "rtcs"],
+      },
+      showVideoDialog: false,
+      streamId: '',
+      app: '',
+      mediaServerId: '',
+      convertKey: '',
+      deviceId: '',
+      channelId: '',
+      tabActiveName: 'media',
+      hasAudio: false,
+      loadingRecords: false,
+      recordsLoading: false,
+      isLoging: false,
+      controSpeed: 30,
+      timeVal: 0,
+      timeMin: 0,
+      timeMax: 1440,
+      presetPos: 1,
+      cruisingSpeed: 100,
+      cruisingTime: 5,
+      cruisingGroup: 0,
+      scanSpeed: 100,
+      scanGroup: 0,
+      tracks: [],
+      coverPlaying: false,
+      tracksLoading: false,
+      showPtz: true,
+      showRrecord: true,
+      tracksNotLoaded: false,
+      sliderTime: 0,
+      seekTime: 0,
+      recordStartTime: 0,
+      showTimeText: "00:00:00",
+      streamInfo: null,
+      broadcastRtc: null,
+      broadcastStatus: -1, // -2 姝e湪閲婃斁璧勬簮 -1 榛樿鐘舵�� 0 绛夊緟鎺ラ�� 1 鎺ラ�氭垚鍔�
+    };
+  },
+  methods: {
+    tabHandleClick: function (tab, event) {
+      console.log(tab)
+      var that = this;
+      that.tracks = [];
+      that.tracksLoading = true;
+      that.tracksNotLoaded = false;
+      if (tab.name === "codec") {
+        this.$axios({
+          method: 'get',
+          url: '/zlm/' + this.mediaServerId + '/index/api/getMediaInfo?vhost=__defaultVhost__&schema=rtsp&app=' + this.app + '&stream=' + this.streamId
+        }).then(function (res) {
+          that.tracksLoading = false;
+          if (res.data.code == 0 && res.data.tracks) {
+            that.tracks = res.data.tracks;
+          } else {
+            that.tracksNotLoaded = true;
+            that.$message({
+              showClose: true,
+              message: '鑾峰彇缂栫爜淇℃伅澶辫触,',
+              type: 'warning'
+            });
+          }
+        }).catch(function (e) {
+        });
       }
     },
-    data() {
-        return {
-            video: 'http://lndxyj.iqilu.com/public/upload/2019/10/14/8c001ea0c09cdc59a57829dabc8010fa.mp4',
-            videoUrl: '',
-            activePlayer: "jessibuca",
-            // 濡備綍浣犲彧鏄敤涓�绉嶆挱鏀惧櫒锛岀洿鎺ユ敞閲婃帀涓嶇敤鐨勯儴鍒嗗嵆鍙�
-            player: {
-              jessibuca : ["ws_flv", "wss_flv"],
-              webRTC: ["rtc", "rtcs"],
-            },
-            showVideoDialog: false,
-            streamId: '',
-            app : '',
-            mediaServerId : '',
-            convertKey: '',
-            deviceId: '',
-            channelId: '',
-            tabActiveName: 'media',
-            hasAudio: false,
-            loadingRecords: false,
-            recordsLoading: false,
-            isLoging: false,
-            controSpeed: 30,
-            timeVal: 0,
-            timeMin: 0,
-            timeMax: 1440,
-            presetPos: 1,
-            cruisingSpeed: 100,
-            cruisingTime: 5,
-            cruisingGroup: 0,
-            scanSpeed: 100,
-            scanGroup: 0,
-            tracks: [],
-            coverPlaying:false,
-            tracksLoading: false,
-            showPtz: true,
-            showRrecord: true,
-            tracksNotLoaded: false,
-            sliderTime: 0,
-            seekTime: 0,
-            recordStartTime: 0,
-            showTimeText: "00:00:00",
-            streamInfo: null,
-            broadcastRtc: null,
-            broadcastStatus: -1, // -2 姝e湪閲婃斁璧勬簮 -1 榛樿鐘舵�� 0 绛夊緟鎺ラ�� 1 鎺ラ�氭垚鍔�
-        };
+    changePlayer: function (tab) {
+      console.log(this.player[tab.name][0])
+      this.activePlayer = tab.name;
+      this.videoUrl = this.getUrlByStreamInfo()
+      console.log(this.videoUrl)
     },
-    methods: {
-        tabHandleClick: function(tab, event) {
-            console.log(tab)
-            var that = this;
-            that.tracks = [];
-            that.tracksLoading = true;
-            that.tracksNotLoaded = false;
-            if (tab.name === "codec") {
-                this.$axios({
-                    method: 'get',
-                    url: '/zlm/' +this.mediaServerId+ '/index/api/getMediaInfo?vhost=__defaultVhost__&schema=rtsp&app='+ this.app +'&stream='+ this.streamId
-                }).then(function (res) {
-                    that.tracksLoading = false;
-                    if (res.data.code == 0 && res.data.tracks) {
-                        that.tracks = res.data.tracks;
-                    }else{
-                        that.tracksNotLoaded = true;
-                        that.$message({
-                            showClose: true,
-                            message: '鑾峰彇缂栫爜淇℃伅澶辫触,',
-                            type: 'warning'
-                        });
-                    }
-                }).catch(function (e) {});
-            }
-        },
-        changePlayer: function (tab) {
-            console.log(this.player[tab.name][0])
-            this.activePlayer = tab.name;
-            this.videoUrl = this.getUrlByStreamInfo()
-            console.log(this.videoUrl)
-        },
-        openDialog: function (tab, deviceId, channelId, param) {
-            if (this.showVideoDialog) {
-              return;
-            }
-            this.tabActiveName = tab;
-            this.channelId = channelId;
-            this.deviceId = deviceId;
-            this.streamId = "";
-            this.mediaServerId = "";
-            this.app = "";
-            this.videoUrl = ""
-            if (!!this.$refs[this.activePlayer]) {
-              this.$refs[this.activePlayer].pause();
-            }
-            switch (tab) {
-                case "media":
-                    this.play(param.streamInfo, param.hasAudio)
-                    break;
-                case "streamPlay":
-                    this.tabActiveName = "media";
-                    this.showRrecord = false;
-                    this.showPtz = false;
-                    this.play(param.streamInfo, param.hasAudio)
-                    break;
-                case "control":
-                    break;
-            }
-        },
-        play: function (streamInfo, hasAudio) {
-            this.streamInfo = streamInfo;
-            this.hasAudio = hasAudio;
-            this.isLoging = false;
-            // this.videoUrl = streamInfo.rtc;
-            this.videoUrl = this.getUrlByStreamInfo();
-            this.streamId = streamInfo.stream;
-            this.app = streamInfo.app;
-            this.mediaServerId = streamInfo.mediaServerId;
-            this.playFromStreamInfo(false, streamInfo)
-        },
-        getUrlByStreamInfo(){
-            console.log(this.streamInfo)
-            if (location.protocol === "https:") {
-              this.videoUrl = this.streamInfo[this.player[this.activePlayer][1]]
-            }else {
-              this.videoUrl = this.streamInfo[this.player[this.activePlayer][0]]
-            }
-            return this.videoUrl;
+    openDialog: function (tab, deviceId, channelId, param) {
+      if (this.showVideoDialog) {
+        return;
+      }
+      this.tabActiveName = tab;
+      this.channelId = channelId;
+      this.deviceId = deviceId;
+      this.streamId = "";
+      this.mediaServerId = "";
+      this.app = "";
+      this.videoUrl = ""
+      if (!!this.$refs[this.activePlayer]) {
+        this.$refs[this.activePlayer].pause();
+      }
+      switch (tab) {
+        case "media":
+          this.play(param.streamInfo, param.hasAudio)
+          break;
+        case "streamPlay":
+          this.tabActiveName = "media";
+          this.showRrecord = false;
+          this.showPtz = false;
+          this.play(param.streamInfo, param.hasAudio)
+          break;
+        case "control":
+          break;
+      }
+    },
+    play: function (streamInfo, hasAudio) {
+      this.streamInfo = streamInfo;
+      this.hasAudio = hasAudio;
+      this.isLoging = false;
+      // this.videoUrl = streamInfo.rtc;
+      this.videoUrl = this.getUrlByStreamInfo();
+      this.streamId = streamInfo.stream;
+      this.app = streamInfo.app;
+      this.mediaServerId = streamInfo.mediaServerId;
+      this.playFromStreamInfo(false, streamInfo)
+    },
+    getUrlByStreamInfo() {
+      console.log(this.streamInfo)
+      if (location.protocol === "https:") {
+        this.videoUrl = this.streamInfo[this.player[this.activePlayer][1]]
+      } else {
+        this.videoUrl = this.streamInfo[this.player[this.activePlayer][0]]
+      }
+      return this.videoUrl;
 
-        },
-        coverPlay: function () {
-            var that = this;
-            this.coverPlaying = true;
-            this.$refs[this.activePlayer].pause()
-            that.$axios({
-                method: 'post',
-                url: '/api/play/convert/' + that.streamId
-                }).then(function (res) {
-                    if (res.data.code === 0) {
-                        that.convertKey = res.data.key;
-                        setTimeout(()=>{
-                            that.isLoging = false;
-                            that.playFromStreamInfo(false, res.data.data);
-                        }, 2000)
-                    } else {
-                        that.isLoging = false;
-                        that.coverPlaying = false;
-                        that.$message({
-                            showClose: true,
-                            message: '杞爜澶辫触',
-                            type: 'error'
-                        });
-                    }
-                }).catch(function (e) {
-                    console.log(e)
-                    that.coverPlaying = false;
-                    that.$message({
-                        showClose: true,
-                        message: '鎾斁閿欒',
-                        type: 'error'
-                    });
-                });
-        },
-        convertStopClick: function() {
-            this.convertStop(()=>{
-                this.$refs[this.activePlayer].play(this.videoUrl)
-            });
-        },
-        convertStop: function(callback) {
-            var that = this;
-            that.$refs.videoPlayer.pause()
-            this.$axios({
-                method: 'post',
-                url: '/api/play/convertStop/' + this.convertKey
-              }).then(function (res) {
-                if (res.data.code == 0) {
-                  console.log(res.data.msg)
-                }else {
-                  console.error(res.data.msg)
-                }
-                 if (callback )callback();
-              }).catch(function (e) {});
-            that.coverPlaying = false;
-            that.convertKey = "";
-            // if (callback )callback();
-        },
+    },
+    coverPlay: function () {
+      var that = this;
+      this.coverPlaying = true;
+      this.$refs[this.activePlayer].pause()
+      that.$axios({
+        method: 'post',
+        url: '/api/play/convert/' + that.streamId
+      }).then(function (res) {
+        if (res.data.code === 0) {
+          that.convertKey = res.data.key;
+          setTimeout(() => {
+            that.isLoging = false;
+            that.playFromStreamInfo(false, res.data.data);
+          }, 2000)
+        } else {
+          that.isLoging = false;
+          that.coverPlaying = false;
+          that.$message({
+            showClose: true,
+            message: '杞爜澶辫触',
+            type: 'error'
+          });
+        }
+      }).catch(function (e) {
+        console.log(e)
+        that.coverPlaying = false;
+        that.$message({
+          showClose: true,
+          message: '鎾斁閿欒',
+          type: 'error'
+        });
+      });
+    },
+    convertStopClick: function () {
+      this.convertStop(() => {
+        this.$refs[this.activePlayer].play(this.videoUrl)
+      });
+    },
+    convertStop: function (callback) {
+      var that = this;
+      that.$refs.videoPlayer.pause()
+      this.$axios({
+        method: 'post',
+        url: '/api/play/convertStop/' + this.convertKey
+      }).then(function (res) {
+        if (res.data.code == 0) {
+          console.log(res.data.msg)
+        } else {
+          console.error(res.data.msg)
+        }
+        if (callback) callback();
+      }).catch(function (e) {
+      });
+      that.coverPlaying = false;
+      that.convertKey = "";
+      // if (callback )callback();
+    },
 
-        playFromStreamInfo: function (realHasAudio, streamInfo) {
-          this.showVideoDialog = true;
-          this.hasaudio = realHasAudio && this.hasaudio;
-          this.$refs[this.activePlayer].play(this.getUrlByStreamInfo(streamInfo))
-        },
-        close: function () {
-            console.log('鍏抽棴瑙嗛');
-            if (!!this.$refs[this.activePlayer]){
-              this.$refs[this.activePlayer].pause();
-            }
-            this.videoUrl = '';
-            this.coverPlaying = false;
-            this.showVideoDialog = false;
-            if (this.convertKey != '') {
-              this.convertStop();
-            }
-            this.convertKey = ''
-            this.stopBroadcast()
-        },
+    playFromStreamInfo: function (realHasAudio, streamInfo) {
+      this.showVideoDialog = true;
+      this.hasaudio = realHasAudio && this.hasaudio;
+      this.$refs[this.activePlayer].play(this.getUrlByStreamInfo(streamInfo))
+    },
+    close: function () {
+      console.log('鍏抽棴瑙嗛');
+      if (!!this.$refs[this.activePlayer]) {
+        this.$refs[this.activePlayer].pause();
+      }
+      this.videoUrl = '';
+      this.coverPlaying = false;
+      this.showVideoDialog = false;
+      if (this.convertKey != '') {
+        this.convertStop();
+      }
+      this.convertKey = ''
+      this.stopBroadcast()
+    },
 
-        copySharedInfo: function (data) {
-            console.log('澶嶅埗鍐呭锛�' + data);
-            this.coverPlaying = false;
-            this.tracks = []
-            let _this = this;
-            this.$copyText(data).then(
-                function (e) {
-                    _this.$message({
-                        showClose: true,
-                        message: '澶嶅埗鎴愬姛',
-                        type: 'success'
-                    });
-                },
-                function (e) {
-                    _this.$message({
-                        showClose: true,
-                        message: '澶嶅埗澶辫触锛岃鎵嬪姩澶嶅埗',
-                        type: 'error'
-                    });
-                }
-            );
+    copySharedInfo: function (data) {
+      console.log('澶嶅埗鍐呭锛�' + data);
+      this.coverPlaying = false;
+      this.tracks = []
+      let _this = this;
+      this.$copyText(data).then(
+        function (e) {
+          _this.$message({
+            showClose: true,
+            message: '澶嶅埗鎴愬姛',
+            type: 'success'
+          });
         },
-        ptzCamera: function (command) {
-            console.log('浜戝彴鎺у埗锛�' + command);
-            let that = this;
-            this.$axios({
-                method: 'post',
-                url: '/api/ptz/control/' + this.deviceId + '/' + this.channelId + '?command=' + command + '&horizonSpeed=' + this.controSpeed + '&verticalSpeed=' + this.controSpeed + '&zoomSpeed=' + this.controSpeed
-            }).then(function (res) {});
-        },
-        //////////////////////鎾斁鍣ㄤ簨浠跺鐞�//////////////////////////
-        videoError: function (e) {
-            console.log("鎾斁鍣ㄩ敊璇細" + JSON.stringify(e));
-        },
-        presetPosition: function (cmdCode, presetPos) {
-            console.log('棰勭疆浣嶆帶鍒讹細' + this.presetPos + ' : 0x' + cmdCode.toString(16));
-            let that = this;
-            this.$axios({
-                method: 'post',
-                url: '/api/ptz/front_end_command/' + this.deviceId + '/' + this.channelId + '?cmdCode=' + cmdCode + '&parameter1=0&parameter2=' + presetPos + '&combindCode2=0'
-            }).then(function (res) {});
-        },
-        setSpeedOrTime: function (cmdCode, groupNum, parameter) {
-            let that = this;
-            let parameter2 = parameter % 256;
-            let combindCode2 = Math.floor(parameter / 256) * 16;
-            console.log('鍓嶇鎺у埗锛�0x' + cmdCode.toString(16) + ' 0x' + groupNum.toString(16) + ' 0x' + parameter2.toString(16) + ' 0x' + combindCode2.toString(16));
-            this.$axios({
-                method: 'post',
-                url: '/api/ptz/front_end_command/' + this.deviceId + '/' + this.channelId + '?cmdCode=' + cmdCode + '&parameter1=' + groupNum + '&parameter2=' + parameter2 + '&combindCode2=' + combindCode2
-            }).then(function (res) {});
-        },
-        setCommand: function (cmdCode, groupNum, parameter) {
-            let that = this;
-            console.log('鍓嶇鎺у埗锛�0x' + cmdCode.toString(16) + ' 0x' + groupNum.toString(16) + ' 0x' + parameter.toString(16) + ' 0x0');
-            this.$axios({
-                method: 'post',
-                url: '/api/ptz/front_end_command/' + this.deviceId + '/' + this.channelId + '?cmdCode=' + cmdCode + '&parameter1=' + groupNum + '&parameter2=' + parameter + '&combindCode2=0'
-            }).then(function (res) {});
-        },
-        copyUrl: function (dropdownItem){
-            console.log(dropdownItem)
-            this.$copyText(dropdownItem).then((e)=> {
-              this.$message.success("鎴愬姛鎷疯礉鍒扮矘璐存澘");
-            }, (e)=> {
+        function (e) {
+          _this.$message({
+            showClose: true,
+            message: '澶嶅埗澶辫触锛岃鎵嬪姩澶嶅埗',
+            type: 'error'
+          });
+        }
+      );
+    },
+    ptzCamera: function (command) {
+      console.log('浜戝彴鎺у埗锛�' + command);
+      let that = this;
+      this.$axios({
+        method: 'post',
+        url: '/api/ptz/control/' + this.deviceId + '/' + this.channelId + '?command=' + command + '&horizonSpeed=' + this.controSpeed + '&verticalSpeed=' + this.controSpeed + '&zoomSpeed=' + this.controSpeed
+      }).then(function (res) {
+      });
+    },
+    //////////////////////鎾斁鍣ㄤ簨浠跺鐞�//////////////////////////
+    videoError: function (e) {
+      console.log("鎾斁鍣ㄩ敊璇細" + JSON.stringify(e));
+    },
+    presetPosition: function (cmdCode, presetPos) {
+      console.log('棰勭疆浣嶆帶鍒讹細' + this.presetPos + ' : 0x' + cmdCode.toString(16));
+      let that = this;
+      this.$axios({
+        method: 'post',
+        url: '/api/ptz/front_end_command/' + this.deviceId + '/' + this.channelId + '?cmdCode=' + cmdCode + '&parameter1=0&parameter2=' + presetPos + '&combindCode2=0'
+      }).then(function (res) {
+      });
+    },
+    setSpeedOrTime: function (cmdCode, groupNum, parameter) {
+      let that = this;
+      let parameter2 = parameter % 256;
+      let combindCode2 = Math.floor(parameter / 256) * 16;
+      console.log('鍓嶇鎺у埗锛�0x' + cmdCode.toString(16) + ' 0x' + groupNum.toString(16) + ' 0x' + parameter2.toString(16) + ' 0x' + combindCode2.toString(16));
+      this.$axios({
+        method: 'post',
+        url: '/api/ptz/front_end_command/' + this.deviceId + '/' + this.channelId + '?cmdCode=' + cmdCode + '&parameter1=' + groupNum + '&parameter2=' + parameter2 + '&combindCode2=' + combindCode2
+      }).then(function (res) {
+      });
+    },
+    setCommand: function (cmdCode, groupNum, parameter) {
+      let that = this;
+      console.log('鍓嶇鎺у埗锛�0x' + cmdCode.toString(16) + ' 0x' + groupNum.toString(16) + ' 0x' + parameter.toString(16) + ' 0x0');
+      this.$axios({
+        method: 'post',
+        url: '/api/ptz/front_end_command/' + this.deviceId + '/' + this.channelId + '?cmdCode=' + cmdCode + '&parameter1=' + groupNum + '&parameter2=' + parameter + '&combindCode2=0'
+      }).then(function (res) {
+      });
+    },
+    copyUrl: function (dropdownItem) {
+      console.log(dropdownItem)
+      this.$copyText(dropdownItem).then((e) => {
+        this.$message.success("鎴愬姛鎷疯礉鍒扮矘璐存澘");
+      }, (e) => {
 
-            })
-        },
+      })
+    },
+    startBroadcast(url) {
+      // 鑾峰彇鎺ㄦ祦閴存潈Key
+      this.$axios({
+        method: 'post',
+        url: '/api/user/userInfo',
+      }).then((res) => {
+        if (res.data.code !== 0) {
+          this.$message({
+            showClose: true,
+            message: "鑾峰彇鎺ㄦ祦閴存潈Key澶辫触",
+            type: "error",
+          });
+          this.broadcastStatus = -1;
+        } else {
+          let pushKey = res.data.data.pushKey;
+          // 鑾峰彇鎺ㄦ祦閴存潈KEY
+          url += "&sign=" + crypto.createHash('md5').update(pushKey, "utf8").digest('hex')
+          console.log("寮�濮嬭闊冲璁诧細 " + url)
+          this.broadcastRtc = new ZLMRTCClient.Endpoint({
+            debug: true, // 鏄惁鎵撳嵃鏃ュ織
+            zlmsdpUrl: url, //娴佸湴鍧�
+            simulecast: false,
+            useCamera: false,
+            audioEnable: true,
+            videoEnable: false,
+            recvOnly: false,
+          })
 
+          // webrtcPlayer.on(ZLMRTCClient.Events.WEBRTC_ON_REMOTE_STREAMS,(e)=>{//鑾峰彇鍒颁簡杩滅娴侊紝鍙互鎾斁
+          //   console.error('鎾斁鎴愬姛',e.streams)
+          //   this.broadcastStatus = 1;
+          // });
+          //
+          // webrtcPlayer.on(ZLMRTCClient.Events.WEBRTC_ON_LOCAL_STREAM,(s)=>{// 鑾峰彇鍒颁簡鏈湴娴�
+          //   this.broadcastStatus = 1;
+          //   // document.getElementById('selfVideo').srcObject=s;
+          //   // this.eventcallbacK("LOCAL STREAM", "鑾峰彇鍒颁簡鏈湴娴�")
+          // });
 
-              this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_ICE_CANDIDATE_ERROR,(e)=>{// ICE 鍗忓晢鍑洪敊
-                console.error('ICE 鍗忓晢鍑洪敊')
-                this.$message({
-                  showClose: true,
-                  message: 'ICE 鍗忓晢鍑洪敊',
-                  type: 'error'
-                });
-                this.broadcastStatus = -1;
-              });
-
-              this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED,(e)=>{// offer anwser 浜ゆ崲澶辫触
-                console.error('offer anwser 浜ゆ崲澶辫触',e)
-                this.$message({
-                  showClose: true,
-                  message: 'offer anwser 浜ゆ崲澶辫触' + e,
-                  type: 'error'
-                });
-                this.broadcastStatus = -1;
-              });
-              this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_ON_CONNECTION_STATE_CHANGE,(e)=>{// offer anwser 浜ゆ崲澶辫触
-                console.log('鐘舵�佹敼鍙�',e)
-                if (e === "connecting") {
-                  this.broadcastStatus = 0;
-                }else if (e === "connected") {
-                  this.broadcastStatus = 1;
-                }else if (e === "disconnected") {
-                  this.broadcastStatus = -1;
-                }
-              });
-              this.broadcastRtc.on(ZLMRTCClient.Events.CAPTURE_STREAM_FAILED,(e)=>{// offer anwser 浜ゆ崲澶辫触
-                console.log('鎹曡幏娴佸け璐�',e)
-                this.$message({
-                  showClose: true,
-                  message: '鎹曡幏娴佸け璐�' + e,
-                  type: 'error'
-                });
-                this.broadcastStatus = -1;
-              });
-            }
-          }).catch((e) => {
+          this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_NOT_SUPPORT, (e) => {// 鑾峰彇鍒颁簡鏈湴娴�
+            console.error('涓嶆敮鎸亀ebrtc', e)
             this.$message({
               showClose: true,
-              message: e,
+              message: '涓嶆敮鎸亀ebrtc, 鏃犳硶杩涜璇煶瀵硅',
               type: 'error'
             });
             this.broadcastStatus = -1;
           });
 
+          this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_ICE_CANDIDATE_ERROR, (e) => {// ICE 鍗忓晢鍑洪敊
+            console.error('ICE 鍗忓晢鍑洪敊')
+            this.$message({
+              showClose: true,
+              message: 'ICE 鍗忓晢鍑洪敊',
+              type: 'error'
+            });
+            this.broadcastStatus = -1;
+          });
 
-        },
-        stopBroadcast(){
-          this.broadcastRtc.close();
-          this.broadcastStatus = -1;
-          this.$axios({
-            method: 'get',
-            url: '/api/play/broadcast/stop/' + this.deviceId + '/' + this.channelId
-          }).then( (res)=> {
-            if (res.data.code == 0) {
-              // this.broadcastStatus = -1;
-              // this.broadcastRtc.close()
-            }else {
-              this.$message({
-                showClose: true,
-                message: res.data.msg,
-                type: "error",
-              });
+          this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_OFFER_ANWSER_EXCHANGE_FAILED, (e) => {// offer anwser 浜ゆ崲澶辫触
+            console.error('offer anwser 浜ゆ崲澶辫触', e)
+            this.$message({
+              showClose: true,
+              message: 'offer anwser 浜ゆ崲澶辫触' + e,
+              type: 'error'
+            });
+            this.broadcastStatus = -1;
+          });
+          this.broadcastRtc.on(ZLMRTCClient.Events.WEBRTC_ON_CONNECTION_STATE_CHANGE, (e) => {// offer anwser 浜ゆ崲澶辫触
+            console.log('鐘舵�佹敼鍙�', e)
+            if (e === "connecting") {
+              this.broadcastStatus = 0;
+            } else if (e === "connected") {
+              this.broadcastStatus = 1;
+            } else if (e === "disconnected") {
+              this.broadcastStatus = -1;
             }
           });
+          this.broadcastRtc.on(ZLMRTCClient.Events.CAPTURE_STREAM_FAILED, (e) => {// offer anwser 浜ゆ崲澶辫触
+            console.log('鎹曡幏娴佸け璐�', e)
+            this.$message({
+              showClose: true,
+              message: '鎹曡幏娴佸け璐�' + e,
+              type: 'error'
+            });
+            this.broadcastStatus = -1;
+          });
         }
+      }).catch((e) => {
+        this.$message({
+          showClose: true,
+          message: e,
+          type: 'error'
+        });
+        this.broadcastStatus = -1;
+      });
+
+
+    },
+    stopBroadcast() {
+      this.broadcastRtc.close();
+      this.broadcastStatus = -1;
+      this.$axios({
+        method: 'get',
+        url: '/api/play/broadcast/stop/' + this.deviceId + '/' + this.channelId
+      }).then((res) => {
+        if (res.data.code == 0) {
+          // this.broadcastStatus = -1;
+          // this.broadcastRtc.close()
+        } else {
+          this.$message({
+            showClose: true,
+            message: res.data.msg,
+            type: "error",
+          });
+        }
+      });
     }
+  }
 };
 </script>
 
 <style>
 .control-wrapper {
-    position: relative;
-    width: 6.25rem;
-    height: 6.25rem;
-    max-width: 6.25rem;
-    max-height: 6.25rem;
-    border-radius: 100%;
-    margin-top: 1.5rem;
-    margin-left: 0.5rem;
-    float: left;
+  position: relative;
+  width: 6.25rem;
+  height: 6.25rem;
+  max-width: 6.25rem;
+  max-height: 6.25rem;
+  border-radius: 100%;
+  margin-top: 1.5rem;
+  margin-left: 0.5rem;
+  float: left;
 }
 
 .control-panel {
-    position: relative;
-    top: 0;
-    left: 5rem;
-    height: 11rem;
-    max-height: 11rem;
+  position: relative;
+  top: 0;
+  left: 5rem;
+  height: 11rem;
+  max-height: 11rem;
 }
 
 .control-btn {
-    display: flex;
-    justify-content: center;
-    position: absolute;
-    width: 44%;
-    height: 44%;
-    border-radius: 5px;
-    border: 1px solid #78aee4;
-    box-sizing: border-box;
-    transition: all 0.3s linear;
+  display: flex;
+  justify-content: center;
+  position: absolute;
+  width: 44%;
+  height: 44%;
+  border-radius: 5px;
+  border: 1px solid #78aee4;
+  box-sizing: border-box;
+  transition: all 0.3s linear;
 }
+
 .control-btn:hover {
-    cursor:pointer
+  cursor: pointer
 }
 
 .control-btn i {
-    font-size: 20px;
-    color: #78aee4;
-    display: flex;
-    justify-content: center;
-    align-items: center;
+  font-size: 20px;
+  color: #78aee4;
+  display: flex;
+  justify-content: center;
+  align-items: center;
 }
+
 .control-btn i:hover {
-    cursor:pointer
+  cursor: pointer
 }
+
 .control-zoom-btn:hover {
-    cursor:pointer
+  cursor: pointer
 }
 
 .control-round {
-    position: absolute;
-    top: 21%;
-    left: 21%;
-    width: 58%;
-    height: 58%;
-    background: #fff;
-    border-radius: 100%;
+  position: absolute;
+  top: 21%;
+  left: 21%;
+  width: 58%;
+  height: 58%;
+  background: #fff;
+  border-radius: 100%;
 }
 
 .control-round-inner {
-    position: absolute;
-    left: 13%;
-    top: 13%;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    width: 70%;
-    height: 70%;
-    font-size: 40px;
-    color: #78aee4;
-    border: 1px solid #78aee4;
-    border-radius: 100%;
-    transition: all 0.3s linear;
+  position: absolute;
+  left: 13%;
+  top: 13%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 70%;
+  height: 70%;
+  font-size: 40px;
+  color: #78aee4;
+  border: 1px solid #78aee4;
+  border-radius: 100%;
+  transition: all 0.3s linear;
 }
 
 .control-inner-btn {
-    position: absolute;
-    width: 60%;
-    height: 60%;
-    background: #fafafa;
+  position: absolute;
+  width: 60%;
+  height: 60%;
+  background: #fafafa;
 }
 
 .control-top {
-    top: -8%;
-    left: 27%;
-    transform: rotate(-45deg);
-    border-radius: 5px 100% 5px 0;
+  top: -8%;
+  left: 27%;
+  transform: rotate(-45deg);
+  border-radius: 5px 100% 5px 0;
 }
 
 .control-top i {
-    transform: rotate(45deg);
-    border-radius: 5px 100% 5px 0;
+  transform: rotate(45deg);
+  border-radius: 5px 100% 5px 0;
 }
 
 .control-top .control-inner {
-    left: -1px;
-    bottom: 0;
-    border-top: 1px solid #78aee4;
-    border-right: 1px solid #78aee4;
-    border-radius: 0 100% 0 0;
+  left: -1px;
+  bottom: 0;
+  border-top: 1px solid #78aee4;
+  border-right: 1px solid #78aee4;
+  border-radius: 0 100% 0 0;
 }
 
 .control-top .fa {
-    transform: rotate(45deg) translateY(-7px);
+  transform: rotate(45deg) translateY(-7px);
 }
 
 .control-left {
-    top: 27%;
-    left: -8%;
-    transform: rotate(45deg);
-    border-radius: 5px 0 5px 100%;
+  top: 27%;
+  left: -8%;
+  transform: rotate(45deg);
+  border-radius: 5px 0 5px 100%;
 }
 
 .control-left i {
-    transform: rotate(-45deg);
+  transform: rotate(-45deg);
 }
 
 .control-left .control-inner {
-    right: -1px;
-    top: -1px;
-    border-bottom: 1px solid #78aee4;
-    border-left: 1px solid #78aee4;
-    border-radius: 0 0 0 100%;
+  right: -1px;
+  top: -1px;
+  border-bottom: 1px solid #78aee4;
+  border-left: 1px solid #78aee4;
+  border-radius: 0 0 0 100%;
 }
 
 .control-left .fa {
-    transform: rotate(-45deg) translateX(-7px);
+  transform: rotate(-45deg) translateX(-7px);
 }
 
 .control-right {
-    top: 27%;
-    right: -8%;
-    transform: rotate(45deg);
-    border-radius: 5px 100% 5px 0;
+  top: 27%;
+  right: -8%;
+  transform: rotate(45deg);
+  border-radius: 5px 100% 5px 0;
 }
 
 .control-right i {
-    transform: rotate(-45deg);
+  transform: rotate(-45deg);
 }
 
 .control-right .control-inner {
-    left: -1px;
-    bottom: -1px;
-    border-top: 1px solid #78aee4;
-    border-right: 1px solid #78aee4;
-    border-radius: 0 100% 0 0;
+  left: -1px;
+  bottom: -1px;
+  border-top: 1px solid #78aee4;
+  border-right: 1px solid #78aee4;
+  border-radius: 0 100% 0 0;
 }
 
 .control-right .fa {
-    transform: rotate(-45deg) translateX(7px);
+  transform: rotate(-45deg) translateX(7px);
 }
 
 .control-bottom {
-    left: 27%;
-    bottom: -8%;
-    transform: rotate(45deg);
-    border-radius: 0 5px 100% 5px;
+  left: 27%;
+  bottom: -8%;
+  transform: rotate(45deg);
+  border-radius: 0 5px 100% 5px;
 }
 
 .control-bottom i {
-    transform: rotate(-45deg);
+  transform: rotate(-45deg);
 }
 
 .control-bottom .control-inner {
-    top: -1px;
-    left: -1px;
-    border-bottom: 1px solid #78aee4;
-    border-right: 1px solid #78aee4;
-    border-radius: 0 0 100% 0;
+  top: -1px;
+  left: -1px;
+  border-bottom: 1px solid #78aee4;
+  border-right: 1px solid #78aee4;
+  border-radius: 0 0 100% 0;
 }
 
 .control-bottom .fa {
-    transform: rotate(-45deg) translateY(7px);
+  transform: rotate(-45deg) translateY(7px);
 }
+
 .trank {
-    width: 80%;
-    height: 180px;
-    text-align: left;
-    padding: 0 10%;
-    overflow: auto;
+  width: 80%;
+  height: 180px;
+  text-align: left;
+  padding: 0 10%;
+  overflow: auto;
 }
+
 .trankInfo {
-    width: 80%;
-    padding: 0 10%;
+  width: 80%;
+  padding: 0 10%;
 }
 </style>

--
Gitblit v1.8.0