优化直播流点播流程, 添加流代理接口添加直接关联国标功能
| | |
| | | DeviceChannel channel = storager.queryChannelInParentPlatform(requesterId, channelId);
|
| | | GbStream gbStream = storager.queryStreamInParentPlatform(requesterId, channelId);
|
| | | // 不是通道可能是直播流
|
| | | if (channel != null || gbStream != null ) {
|
| | | if (channel != null && gbStream == null ) {
|
| | | if (channel.getStatus() == 0) {
|
| | | logger.info("通道离线,返回400");
|
| | | responseAck(evt, Response.BAD_REQUEST, "channel [" + channel.getChannelId() + "] offline");
|
| | | return;
|
| | | }
|
| | | responseAck(evt, Response.CALL_IS_BEING_FORWARDED); // 通道存在,发181,呼叫转接中
|
| | | }else if(channel == null && gbStream != null){
|
| | | Boolean streamReady = zlmrtpServerFactory.isStreamReady(gbStream.getApp(), gbStream.getStream());
|
| | | if (!streamReady) {
|
| | | logger.info("[ app={}, stream={} ]通道离线,返回400",gbStream.getApp(), gbStream.getStream());
|
| | | responseAck(evt, Response.BAD_REQUEST, "channel [" + gbStream.getGbId() + "] offline");
|
| | | return;
|
| | | }
|
| | | responseAck(evt, Response.CALL_IS_BEING_FORWARDED); // 通道存在,发181,呼叫转接中
|
| | |
| | | // 写入redis, 超时时回复
|
| | | redisCatchStorage.updateSendRTPSever(sendRtpItem);
|
| | |
|
| | | // 检测直播流是否在线
|
| | | Boolean streamReady = zlmrtpServerFactory.isStreamReady(gbStream.getApp(), gbStream.getStream());
|
| | | if (streamReady) {
|
| | | sendRtpItem.setStatus(1);
|
| | | redisCatchStorage.updateSendRTPSever(sendRtpItem);
|
| | | // TODO 添加对tcp的支持
|
| | |
| | | e.printStackTrace();
|
| | | } catch (ParseException e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | |
| | | private boolean enable; |
| | | private boolean enable_hls; |
| | | private boolean enable_mp4; |
| | | private String platformGbId; |
| | | |
| | | public String getType() { |
| | | return type; |
| | |
| | | } |
| | | |
| | | |
| | | public String getPlatformGbId() { |
| | | return platformGbId; |
| | | } |
| | | |
| | | public void setPlatformGbId(String platformGbId) { |
| | | this.platformGbId = platformGbId; |
| | | } |
| | | } |
| | |
| | | JSONArray tracks = mediaJSON.getJSONArray("tracks"); |
| | | streamInfo = getStreamInfoByAppAndStream(app, stream, tracks); |
| | | } |
| | | |
| | | } |
| | | return streamInfo; |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | package com.genersoft.iot.vmp.service.impl; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.genersoft.iot.vmp.gb28181.bean.GbStream; |
| | | import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig; |
| | | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
| | | import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem; |
| | | import com.genersoft.iot.vmp.service.IGbStreamService; |
| | | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; |
| | | import com.genersoft.iot.vmp.storager.IVideoManagerStorager; |
| | | import com.genersoft.iot.vmp.storager.dao.GbStreamMapper; |
| | |
| | | import com.github.pagehelper.PageInfo; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 视频代理业务 |
| | |
| | | @Autowired |
| | | private PlatformGbStreamMapper platformGbStreamMapper; |
| | | |
| | | @Autowired |
| | | private IGbStreamService gbStreamService; |
| | | |
| | | |
| | | @Override |
| | | public String save(StreamProxyItem param) { |
| | |
| | | param.getStream() ); |
| | | param.setDst_url(dstUrl); |
| | | StringBuffer result = new StringBuffer(); |
| | | boolean streamLive = false; |
| | | // 更新 |
| | | if (videoManagerStorager.queryStreamProxy(param.getApp(), param.getStream()) != null) { |
| | | if (videoManagerStorager.updateStreamProxy(param)) { |
| | |
| | | }else { // 新增 |
| | | if (videoManagerStorager.addStreamProxy(param)){ |
| | | result.append("保存成功"); |
| | | streamLive = true; |
| | | if (param.isEnable()) { |
| | | JSONObject jsonObject = addStreamProxyToZlm(param); |
| | | if (jsonObject == null) { |
| | | streamLive = false; |
| | | result.append(", 但是启用失败,请检查流地址是否可用"); |
| | | param.setEnable(false); |
| | | videoManagerStorager.updateStreamProxy(param); |
| | |
| | | } |
| | | |
| | | } |
| | | if (param.getPlatformGbId() != null && streamLive) { |
| | | List<GbStream> gbStreams = new ArrayList<>(); |
| | | gbStreams.add(param); |
| | | if (gbStreamService.addPlatformInfo(gbStreams, param.getPlatformGbId())){ |
| | | result.append(", 关联国标平台[ " + param.getPlatformGbId() + " ]成功"); |
| | | }else { |
| | | result.append(", 关联国标平台[ " + param.getPlatformGbId() + " ]失败"); |
| | | } |
| | | } |
| | | return result.toString(); |
| | | } |
| | | |
| | |
| | | @ResponseBody |
| | | public WVPResult del(String app, String stream){ |
| | | logger.info("移除代理: " + app + "/" + stream); |
| | | streamProxyService.del(app, stream); |
| | | WVPResult<Object> result = new WVPResult<>(); |
| | | if (app == null || stream == null) { |
| | | result.setCode(400); |
| | | result.setMsg(app == null ?"app不能为null":"stream不能为null"); |
| | | }else { |
| | | streamProxyService.del(app, stream); |
| | | result.setCode(0); |
| | | result.setMsg("success"); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="gbId" label="国标编码" width="180" align="center" show-overflow-tooltip/> |
| | | <el-table-column label="启用" width="120" align="center"> |
| | | <template slot-scope="scope"> |
| | | <div slot="reference" class="name-wrapper"> |
| | | <el-tag size="medium" v-if="scope.row.enable">已启用</el-tag> |
| | | <el-tag size="medium" type="info" v-if="!scope.row.enable">未启用</el-tag> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="转HLS" width="120" align="center"> |
| | | <template slot-scope="scope"> |
| | | <div slot="reference" class="name-wrapper"> |
| | |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="启用" width="120" align="center"> |
| | | <template slot-scope="scope"> |
| | | <div slot="reference" class="name-wrapper"> |
| | | <el-tag size="medium" v-if="scope.row.enable">已启用</el-tag> |
| | | <el-tag size="medium" type="info" v-if="!scope.row.enable">未启用</el-tag> |
| | | </div> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | |
| | | <el-table-column label="操作" width="360" align="center" fixed="right"> |
| | | <template slot-scope="scope"> |
| | |
| | | <el-option label="组播" value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="国标平台"> |
| | | <el-select |
| | | v-model="proxyParam.platformGbId" |
| | | style="width: 100%" |
| | | placeholder="请选择国标平台" |
| | | > |
| | | <el-option |
| | | v-for="item in platformList" |
| | | :key="item.name" |
| | | :label="item.name" |
| | | :value="item.serverGBId"> |
| | | <span style="float: left">{{ item.name }}</span> |
| | | <span style="float: right; color: #8492a6; font-size: 13px">{{ item.serverGBId }}</span> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="其他选项"> |
| | | <div style="float: left;"> |
| | | <el-checkbox label="启用" v-model="proxyParam.enable" ></el-checkbox> |
| | |
| | | isLoging: false, |
| | | dialogLoading: false, |
| | | onSubmit_text: "立即创建", |
| | | platformList: [{ |
| | | id: 1, |
| | | enable: true, |
| | | name: "141", |
| | | serverGBId: "34020000002000000001", |
| | | serverGBDomain: "3402000000", |
| | | serverIP: "192.168.1.141", |
| | | serverPort: 15060, |
| | | deviceGBId: "34020000002000000001", |
| | | deviceIp: "192.168.1.20", |
| | | devicePort: "5060", |
| | | username: "34020000002000000001", |
| | | password: "12345678", |
| | | expires: "300", |
| | | keepTimeout: "60", |
| | | transport: "UDP", |
| | | characterSet: "GB2312", |
| | | ptz: false, |
| | | rtcp: false, |
| | | status: true, |
| | | }], |
| | | proxyParam: { |
| | | name: null, |
| | | type: "default", |
| | |
| | | enable: true, |
| | | enable_hls: true, |
| | | enable_mp4: false, |
| | | platformGbId: null, |
| | | }, |
| | | |
| | | rules: { |
| | |
| | | if (proxyParam != null) { |
| | | this.proxyParam = proxyParam; |
| | | } |
| | | |
| | | let that = this; |
| | | |
| | | this.$axios({ |
| | | method: 'get', |
| | | url:`/api/platform/query/10000/0` |
| | | }).then(function (res) { |
| | | that.platformList = res.data.list; |
| | | }).catch(function (error) { |
| | | console.log(error); |
| | | }); |
| | | }, |
| | | onSubmit: function () { |
| | | console.log("onSubmit"); |
| | |
| | | callback(new Error("请输入设备国标编号")); |
| | | } else { |
| | | var exit = await this.deviceGBIdExit(value); |
| | | console.log(exit); |
| | | console.log(exit == "true"); |
| | | console.log(exit === "true"); |
| | | if (exit) { |
| | | callback(new Error("设备国标编号已存在")); |
| | | } else { |