From f75b3e6cdab1c0ad98eb09906912a42b783f67bf Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: 星期二, 08 十二月 2020 18:11:02 +0800
Subject: [PATCH] 使用异步接口, 更好的并发, 对hook使用订阅机制 替换前段播放器, 支持h265的播放 放弃循环获取编码信息,

---
 web_src/src/components/gb28181/devicePlayer.vue |  222 +++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 141 insertions(+), 81 deletions(-)

diff --git a/web_src/src/components/gb28181/devicePlayer.vue b/web_src/src/components/gb28181/devicePlayer.vue
index c87d0c4..ddf90c2 100644
--- a/web_src/src/components/gb28181/devicePlayer.vue
+++ b/web_src/src/components/gb28181/devicePlayer.vue
@@ -1,9 +1,11 @@
 <template>
 <div id="devicePlayer" v-loading="isLoging">
+    
     <el-dialog title="瑙嗛鎾斁" top="0" :close-on-click-modal="false" :visible.sync="showVideoDialog" :destroy-on-close="true" @close="close()">
-        <LivePlayer v-if="showVideoDialog" ref="videoPlayer" :videoUrl="videoUrl" :error="videoError" :message="videoError" :hasaudio="hasaudio" fluent autoplay live></LivePlayer>
+        <!-- <LivePlayer v-if="showVideoDialog" ref="videoPlayer" :videoUrl="videoUrl" :error="videoError" :message="videoError" :hasaudio="hasaudio" fluent autoplay live></LivePlayer> -->
+        <player ref="videoPlayer" :visible.sync="showVideoDialog" :videoUrl="videoUrl" :error="videoError" :message="videoError" :hasaudio="hasaudio" fluent autoplay live></player>
         <div id="shared" style="text-align: right; margin-top: 1rem;">
-            <el-tabs v-model="tabActiveName">
+            <el-tabs v-model="tabActiveName" @tab-click="tabHandleClick">
                 <el-tab-pane label="瀹炴椂瑙嗛" name="media">
                     <div style="margin-bottom: 0.5rem;">
                         <!--		<el-button type="primary" size="small" @click="playRecord(true, '')">鎾斁</el-button>-->
@@ -97,6 +99,32 @@
                         </div>
                     </div>
                 </el-tab-pane>
+                <el-tab-pane label="缂栫爜淇℃伅" name="codec" v-loading="tracksLoading">
+                    <p>
+                        鏃犳硶鎾斁鎴栬�呮病鏈夊0闊�?&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" >
+                        <div v-for="(item, index) in tracks">
+                            <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-tabs>
         </div>
     </el-dialog>
@@ -104,12 +132,12 @@
 </template>
 
 <script>
-import LivePlayer from '@liveqing/liveplayer'
+import player from './player.vue'
 export default {
     name: 'devicePlayer',
     props: {},
     components: {
-        LivePlayer
+        player,
     },
     computed: {
         getPlayerShared: function () {
@@ -131,6 +159,7 @@
             },
             showVideoDialog: false,
             ssrc: '',
+            streamId: '',
             convertKey: '',
             deviceId: '',
             channelId: '',
@@ -148,20 +177,45 @@
             cruisingGroup: 0,
             scanSpeed: 100,
             scanGroup: 0,
+            tracks: [],
+            coverPlaying:false,
+            tracksLoading: false
         };
     },
     methods: {
+        tabHandleClick: function(tab, event) {
+            console.log(tab)
+            var that = this;
+            that.tracks = [];
+            that.tracksLoading = true;
+            if (tab.name == "codec") {
+                this.$axios({
+                    method: 'get',
+                    url: '/zlm/index/api/getMediaInfo?vhost=__defaultVhost__&schema=rtmp&app=rtp&stream='+ this.streamId
+                }).then(function (res) {
+                    that.tracksLoading = false;
+                    if (res.data.code == 0 && res.data.online) {
+                        that.tracks = res.data.tracks;
+                    }else{
+                        that.$message({
+                            showClose: true,
+                            message: '鑾峰彇缂栫爜淇℃伅澶辫触,',
+                            type: 'warning'
+                        });
+                    }
+                }).catch(function (e) {});
+            }
+        },
         openDialog: function (tab, deviceId, channelId, param) {
             this.tabActiveName = tab;
             this.channelId = channelId;
             this.deviceId = deviceId;
             this.ssrc = "";
+            this.streamId = "";
             this.videoUrl = ""
             if (!!this.$refs.videoPlayer) {
                 this.$refs.videoPlayer.pause();
             }
-
-
             switch (tab) {
                 case "media":
                     this.play(param.streamInfo, param.hasAudio)
@@ -180,85 +234,56 @@
             console.log(val)
         },
         play: function (streamInfo, hasAudio) {
+            
             this.hasaudio = hasAudio;
-            var that = this;
-            that.isLoging = false;
-            if (!!streamInfo.tracks && streamInfo.tracks.length > 0 ) {
-                for (let i = 0; i < streamInfo.tracks.length; i++) {
-                  if (streamInfo.tracks[i].codec_type == 0 && streamInfo.tracks[i].codec_id_name != "CodecH264") { // 鍒ゆ柇涓篐265瑙嗛
-                    that.coverPlay(streamInfo, streamInfo.tracks[i].codec_id_name, ()=>{
-                      that.close();
-                      return;
-                    })
-                  }else if (streamInfo.tracks[i].codec_type == 1 && streamInfo.tracks[i].codec_id_name != "CodecAAC") {
-                    that.coverPlay(streamInfo, streamInfo.tracks[i].codec_id_name, ()=>{
-                      that.playFromStreamInfo(false. streamInfo)
-                    })
-                  }else if (streamInfo.tracks[i].codec_type == 1 && streamInfo.tracks[i].codec_id_name == "CodecAAC") {
-                    that.playFromStreamInfo(true, streamInfo)
-                  }else {
-                    that.playFromStreamInfo(false, streamInfo)
-                  }
-                }
-            }else {
-              that.playFromStreamInfo(false, streamInfo)
-            }
+            this.isLoging = false;
+            this.videoUrl = streamInfo.ws_flv;
+            this.ssrc = streamInfo.ssrc;
+            this.streamId = streamInfo.streamId;
+            this.playFromStreamInfo(false, streamInfo)
         },
-        coverPlay: function (streamInfo, codec_id_name, catchcallback) {
-          var that = this;
-
-          that.$confirm(codec_id_name + ' 缂栫爜鏍煎紡涓嶆敮鎸佹挱鏀�, 鏄惁杞爜鎾斁?', '鎻愮ず', {
-              confirmButtonText: '纭畾',
-              cancelButtonText: '鍙栨秷',
-              type: 'warning'
-            }).then(() => {
-              that.isLoging = true;
-              that.$axios({
+        coverPlay: function () {
+            var that = this;
+            this.coverPlaying = true;
+            this.$refs.videoPlayer.pause()
+            that.$axios({
                 method: 'post',
-                url: '/api/play/' + streamInfo.ssrc + '/convert'
-              }).then(function (res) {
-                if (res.data.code == 0) {
-                  streamInfo.ws_flv = res.data.ws_flv;
-                  that.convertKey = res.data.key;
-                  setTimeout(()=>{
-                    that.isLoging = false;
-                    that.playFromStreamInfo(false, streamInfo);
-                  }, 2000)
-                } else {
-                  that.isLoging = false;
-                  that.$message({
-                    showClose: true,
-                    message: '杞爜澶辫触',
-                    type: 'error'
-                  });
-                }
-              }).catch(function (e) {
-                that.$message({
-                  showClose: true,
-                  message: '鎾斁閿欒',
-                  type: 'error'
+                url: '/api/play/' + that.ssrc + '/convert'
+                }).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'
+                    });
                 });
-              });
-            }).catch(function (e) {
-                if (catchcallback)catchcallback()
+        },
+        convertStopClick: function() {
+            this.convertStop(()=>{
+                this.$refs.videoPlayer.play(this.videoUrl)
             });
         },
-        playFromStreamInfo: function (realHasAudio, streamInfo) {
-          this.videoUrl = streamInfo.ws_flv;
-          this.showVideoDialog = true;
-          this.hasaudio = realHasAudio && this.hasaudio;
-          this.ssrc = streamInfo.ssrc;
-          console.log(this.ssrc);
-        },
-        close: function () {
-            console.log('鍏抽棴瑙嗛');
-            if (!this.$refs.videoPlayer){
-              this.$refs.videoPlayer.pause();
-            }
-            this.videoUrl = '';
-            this.showVideoDialog = false;
-            if (this.convertKey != '') {
-              this.$axios({
+        convertStop: function(callback) {
+            var that = this;
+            that.$refs.videoPlayer.pause()
+            this.$axios({
                 method: 'post',
                 url: '/api/play/convert/stop/' + this.convertKey
               }).then(function (res) {
@@ -267,12 +292,36 @@
                 }else {
                   console.error(res.data.msg)
                 }
+                 if (callback )callback();
               }).catch(function (e) {});
-            }
-          this.convertKey = ''
+            that.coverPlaying = false;
+            that.convertKey = "";
+            if (callback )callback();
         },
+
+        playFromStreamInfo: function (realHasAudio, streamInfo) {
+          this.showVideoDialog = true;
+          this.hasaudio = realHasAudio && this.hasaudio;
+          this.$refs.videoPlayer.play(streamInfo.ws_flv)
+        },
+        close: function () {
+            console.log('鍏抽棴瑙嗛');
+            if (!this.$refs.videoPlayer){
+              this.$refs.videoPlayer.pause();
+            }
+            this.videoUrl = '';
+            this.coverPlaying = false;
+            this.showVideoDialog = false;
+            if (this.convertKey != '') {
+              this.convertStop();
+            }
+            this.convertKey = ''
+        },
+        
         copySharedInfo: function (data) {
             console.log('澶嶅埗鍐呭锛�' + data);
+            this.coverPlaying = false;
+            this.tracks = []
             let _this = this;
             this.$copyText(data).then(
                 function (e) {
@@ -602,4 +651,15 @@
 .control-bottom .fa {
     transform: rotate(-45deg) translateY(7px);
 }
+.trank {
+    width: 80%;
+    height: 180px;
+    text-align: left;
+    padding: 0 10%;
+    overflow: auto;
+}
+.trankInfo {
+    width: 80%;
+    padding: 0 10%;
+}
 </style>

--
Gitblit v1.8.0