Lawrence
2020-11-07 f68cfd8de2cf6e516e220d1a706cecabb2b185aa
优化播放程序,缩短播放加载时间
3个文件已修改
97 ■■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/channelList.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
web_src/src/components/gb28181/devicePlayer.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/play/PlayController.java
@@ -39,7 +39,8 @@
    private ZLMRESTfulUtils zlmresTfulUtils;
    @GetMapping("/play/{deviceId}/{channelId}")
    public ResponseEntity<String> play(@PathVariable String deviceId, @PathVariable String channelId) {
    public ResponseEntity<String> play(@PathVariable String deviceId, @PathVariable String channelId,
    Integer getEncoding) {
        Device device = storager.queryVideoDevice(deviceId);
        StreamInfo streamInfo = storager.queryPlayByDevice(deviceId, channelId);
@@ -64,40 +65,49 @@
        long startTime = System.currentTimeMillis();
        JSONObject rtpInfo = null;
        while (lockFlag) {
            try {
                if (System.currentTimeMillis() - startTime > 60 * 1000) {
                    storager.stopPlay(streamInfo);
                    logger.info("播放等待超时");
                    return new ResponseEntity<String>("timeout", HttpStatus.OK);
                } else {
                    streamInfo = storager.queryPlayByDevice(deviceId, channelId);
                    if (!rtpPushed) {
                        logger.info("查询RTP推流信息...");
                        rtpInfo = zlmresTfulUtils.getRtpInfo(streamId);
                    }
                    if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo != null && streamInfo.getFlv() != null) {
                        logger.info("查询流编码信息:" + streamInfo.getFlv());
                        rtpPushed = true;
                        Thread.sleep(2000);
                        JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId);
                        if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) {
                            lockFlag = false;
                            logger.info("流编码信息已获取");
                            JSONArray tracks = mediaInfo.getJSONArray("tracks");
                            streamInfo.setTracks(tracks);
                            storager.startPlay(streamInfo);
                        } else {
                            logger.info("流编码信息未获取,2秒后重试...");
                        }
        if (getEncoding == 1) {
            while (lockFlag) {
                try {
                    if (System.currentTimeMillis() - startTime > 60 * 1000) {
                        storager.stopPlay(streamInfo);
                        logger.info("播放等待超时");
                        return new ResponseEntity<String>("timeout", HttpStatus.OK);
                    } else {
                        Thread.sleep(2000);
                        continue;
                        streamInfo = storager.queryPlayByDevice(deviceId, channelId);
                        if (!rtpPushed) {
                            logger.info("查询RTP推流信息...");
                            rtpInfo = zlmresTfulUtils.getRtpInfo(streamId);
                        }
                        if (rtpInfo != null && rtpInfo.getBoolean("exist") && streamInfo != null
                                && streamInfo.getFlv() != null) {
                            logger.info("查询流编码信息:" + streamInfo.getFlv());
                            rtpPushed = true;
                            Thread.sleep(2000);
                            JSONObject mediaInfo = zlmresTfulUtils.getMediaInfo("rtp", "rtmp", streamId);
                            if (mediaInfo.getInteger("code") == 0 && mediaInfo.getBoolean("online")) {
                                lockFlag = false;
                                logger.info("流编码信息已获取");
                                JSONArray tracks = mediaInfo.getJSONArray("tracks");
                                streamInfo.setTracks(tracks);
                                storager.startPlay(streamInfo);
                            } else {
                                logger.info("流编码信息未获取,2秒后重试...");
                            }
                        } else {
                            Thread.sleep(2000);
                            continue;
                        }
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } else {
            String flv = storager.getMediaInfo().getLocalIP() + ":" + storager.getMediaInfo().getHttpPort() + "/rtp/"
                    + streamId + ".flv";
            streamInfo.setFlv("http://" + flv);
            streamInfo.setWs_flv("ws://" + flv);
            storager.startPlay(streamInfo);
        }
        if (logger.isDebugEnabled()) {
web_src/src/components/channelList.vue
@@ -58,8 +58,8 @@
                            <el-button size="mini" icon="el-icon-video-play" @click="sendDevicePush(scope.row)">播放</el-button>
                            <el-button size="mini" icon="el-icon-switch-button" type="danger" v-if="scope.row.play" @click="stopDevicePush(scope.row)">停止</el-button>
                            <el-button size="mini" icon="el-icon-s-open" type="primary" v-if="scope.row.parental == 1" @click="changeSubchannel(scope.row)">查看</el-button>
                                              <el-button size="mini" icon="el-icon-video-camera" type="primary" @click="queryRecords(scope.row)">设备录象</el-button>
<!--                             <el-button size="mini" @click="sendDevicePush(scope.row)">录像查询</el-button> -->
                            <el-button size="mini" icon="el-icon-video-camera" type="primary" @click="queryRecords(scope.row)">设备录象</el-button>
                            <!--                             <el-button size="mini" @click="sendDevicePush(scope.row)">录像查询</el-button> -->
                        </el-button-group>
                    </template>
                </el-table-column>
@@ -197,20 +197,21 @@
            let deviceId = this.deviceId;
            this.isLoging = true;
            let channelId = itemData.channelId;
            console.log("通知设备推流1:" + deviceId + " : " + channelId);
            let getEncoding = itemData.hasAudio ? '1' : '0'
            console.log("通知设备推流1:" + deviceId + " : " + channelId + ":" + getEncoding);
            let that = this;
            this.$axios({
                method: 'get',
                url: '/api/play/' + deviceId + '/' + channelId
                url: '/api/play/' + deviceId + '/' + channelId + '?getEncoding=' + getEncoding
            }).then(function (res) {
                console.log(res.data)
                let ssrc = res.data.ssrc;
                that.isLoging = false;
                if (!!ssrc) {
                    // that.$refs.devicePlayer.play(res.data, deviceId, channelId, itemData.hasAudio);
                    that.$refs.devicePlayer.openDialog("media", deviceId, channelId,{
                      streamInfo: res.data,
                      hasAudio: itemData.hasAudio
                    that.$refs.devicePlayer.openDialog("media", deviceId, channelId, {
                        streamInfo: res.data,
                        hasAudio: itemData.hasAudio
                    });
                    that.initData();
                } else {
@@ -219,10 +220,10 @@
            }).catch(function (e) {});
        },
        queryRecords: function (itemData) {
          var format = moment().format("YYYY-M-D");
          let deviceId = this.deviceId;
          let channelId = itemData.channelId;
          this.$refs.devicePlayer.openDialog("record", deviceId, channelId, {date:format})
            var format = moment().format("YYYY-M-D");
            let deviceId = this.deviceId;
            let channelId = itemData.channelId;
            this.$refs.devicePlayer.openDialog("record", deviceId, channelId, {date: format})
        },
        stopDevicePush: function (itemData) {
            console.log(itemData)
web_src/src/components/gb28181/devicePlayer.vue
@@ -223,7 +223,7 @@
        play: function (streamInfo, hasAudio) {
            this.hasaudio = hasAudio;
            // 根据媒体流信息二次判断
            if (!!streamInfo.tracks && streamInfo.tracks.length > 0) {
            if (!!streamInfo.tracks && streamInfo.tracks.length > 0 && hasAudio) {
                var realHasAudio = false;
                for (let i = 0; i < streamInfo.tracks.length; i++) {
                    if (streamInfo.tracks[i].codec_type == 1 && streamInfo.tracks[i].codec_id_name == "CodecAAC") { // 判断为AAC音频