Commit 116d979d87f53f878a8c930cfad2c6a7cc831b19
1 parent
8b0ff376
合并主线
Showing
7 changed files
with
21 additions
and
104 deletions
src/main/java/com/genersoft/iot/vmp/conf/security/dto/LoginUser.java
| @@ -98,5 +98,8 @@ public class LoginUser implements UserDetails, CredentialsContainer { | @@ -98,5 +98,8 @@ public class LoginUser implements UserDetails, CredentialsContainer { | ||
| 98 | return user.getRole(); | 98 | return user.getRole(); |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | + public String getPushKey() { | ||
| 102 | + return user.getPushKey(); | ||
| 103 | + } | ||
| 101 | 104 | ||
| 102 | } | 105 | } |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
| @@ -23,10 +23,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; | @@ -23,10 +23,7 @@ import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe; | ||
| 23 | import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; | 23 | import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager; |
| 24 | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; | 24 | import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils; |
| 25 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; | 25 | import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory; |
| 26 | -import com.genersoft.iot.vmp.media.zlm.dto.MediaItem; | ||
| 27 | -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem; | ||
| 28 | -import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItemLite; | ||
| 29 | -import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; | 26 | +import com.genersoft.iot.vmp.media.zlm.dto.*; |
| 30 | import com.genersoft.iot.vmp.service.IMediaServerService; | 27 | import com.genersoft.iot.vmp.service.IMediaServerService; |
| 31 | import com.genersoft.iot.vmp.service.IMediaService; | 28 | import com.genersoft.iot.vmp.service.IMediaService; |
| 32 | import com.genersoft.iot.vmp.service.IPlayService; | 29 | import com.genersoft.iot.vmp.service.IPlayService; |
| @@ -883,101 +880,15 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -883,101 +880,15 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 883 | 880 | ||
| 884 | // hook监听等待设备推流上来 | 881 | // hook监听等待设备推流上来 |
| 885 | // 添加订阅 | 882 | // 添加订阅 |
| 886 | - JSONObject subscribeKey = new JSONObject(); | ||
| 887 | - subscribeKey.put("app", app); | ||
| 888 | - subscribeKey.put("stream", stream); | ||
| 889 | - subscribeKey.put("regist", true); | ||
| 890 | - subscribeKey.put("schema", "rtsp"); | ||
| 891 | - subscribeKey.put("mediaServerId", mediaServerItem.getId()); | 883 | + HookSubscribeForStreamChange subscribeKey = HookSubscribeFactory.on_stream_changed(app, stream, true, "rtsp", mediaServerItem.getId()); |
| 884 | + | ||
| 892 | String finalSsrc = ssrc; | 885 | String finalSsrc = ssrc; |
| 893 | // 流已经存在时直接推流 | 886 | // 流已经存在时直接推流 |
| 894 | -// JSONObject mediaInfo = zlmresTfulUtils.getMediaList(mediaServerItem, app, stream); | ||
| 895 | -// System.out.println(mediaInfo != null); | ||
| 896 | -// System.out.println(mediaInfo); | ||
| 897 | -// if (mediaInfo != null && | ||
| 898 | -// (mediaInfo.getInteger("code") != null && mediaInfo.getInteger("code") == 0 | ||
| 899 | -// && mediaInfo.getJSONArray("data") != null && mediaInfo.getJSONArray("data").size() > 0)) { | ||
| 900 | -// logger.info("发现已经在推流"); | ||
| 901 | -// JSONArray tracks = mediaInfo.getJSONArray("data").getJSONObject(0).getJSONArray("tracks"); | ||
| 902 | -// Integer codecId = null; | ||
| 903 | -// if (tracks != null && tracks.size() > 0) { | ||
| 904 | -// for (int i = 0; i < tracks.size(); i++) { | ||
| 905 | -// MediaItem.MediaTrack track = JSON.toJavaObject((JSON)tracks.get(i),MediaItem.MediaTrack.class); | ||
| 906 | -// if (track.getCodecType() == 1) { | ||
| 907 | -// codecId = track.getCodecId(); | ||
| 908 | -// break; | ||
| 909 | -// } | ||
| 910 | -// } | ||
| 911 | -// } | ||
| 912 | -// sendRtpItem.setStatus(2); | ||
| 913 | -// redisCatchStorage.updateSendRTPSever(sendRtpItem); | ||
| 914 | -// StringBuffer content = new StringBuffer(200); | ||
| 915 | -// content.append("v=0\r\n"); | ||
| 916 | -// content.append("o="+ config.getId() +" "+ sdp.getOrigin().getSessionId() +" " + sdp.getOrigin().getSessionVersion() + " IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); | ||
| 917 | -// content.append("s=Play\r\n"); | ||
| 918 | -// content.append("c=IN IP4 "+mediaServerItem.getSdpIp()+"\r\n"); | ||
| 919 | -// content.append("t=0 0\r\n"); | ||
| 920 | -// if (codecId == null) { | ||
| 921 | -// if (mediaTransmissionTCP) { | ||
| 922 | -// content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 8\r\n"); | ||
| 923 | -// }else { | ||
| 924 | -// content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n"); | ||
| 925 | -// } | ||
| 926 | -// | ||
| 927 | -// content.append("a=rtpmap:8 PCMA/8000\r\n"); | ||
| 928 | -// }else { | ||
| 929 | -// if (codecId == 4) { | ||
| 930 | -// if (mediaTransmissionTCP) { | ||
| 931 | -// content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 0\r\n"); | ||
| 932 | -// }else { | ||
| 933 | -// content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 0\r\n"); | ||
| 934 | -// } | ||
| 935 | -// content.append("a=rtpmap:0 PCMU/8000\r\n"); | ||
| 936 | -// }else { | ||
| 937 | -// if (mediaTransmissionTCP) { | ||
| 938 | -// content.append("m=audio "+ sendRtpItem.getLocalPort()+" TCP/RTP/AVP 8\r\n"); | ||
| 939 | -// }else { | ||
| 940 | -// content.append("m=audio "+ sendRtpItem.getLocalPort()+" RTP/AVP 8\r\n"); | ||
| 941 | -// } | ||
| 942 | -// content.append("a=rtpmap:8 PCMA/8000\r\n"); | ||
| 943 | -// } | ||
| 944 | -// } | ||
| 945 | -// if (sendRtpItem.isTcp()) { | ||
| 946 | -// content.append("a=connection:new\r\n"); | ||
| 947 | -// if (!sendRtpItem.isTcpActive()) { | ||
| 948 | -// content.append("a=setup:active\r\n"); | ||
| 949 | -// }else { | ||
| 950 | -// content.append("a=setup:passive\r\n"); | ||
| 951 | -// } | ||
| 952 | -// } | ||
| 953 | -// content.append("a=sendonly\r\n"); | ||
| 954 | -// content.append("y="+ finalSsrc + "\r\n"); | ||
| 955 | -// content.append("f=v/////a/1/8/1\r\n"); | ||
| 956 | -// | ||
| 957 | -// ParentPlatform parentPlatform = new ParentPlatform(); | ||
| 958 | -// parentPlatform.setServerIP(device.getIp()); | ||
| 959 | -// parentPlatform.setServerPort(device.getPort()); | ||
| 960 | -// parentPlatform.setServerGBId(device.getDeviceId()); | ||
| 961 | -// try { | ||
| 962 | -// responseSdpAck(evt, content.toString(), parentPlatform); | ||
| 963 | -// Dialog dialog = evt.getDialog(); | ||
| 964 | -// audioBroadcastCatch.setDialog((SIPDialog) dialog); | ||
| 965 | -// audioBroadcastCatch.setRequest((SIPRequest) request); | ||
| 966 | -// audioBroadcastManager.update(audioBroadcastCatch); | ||
| 967 | -// } catch (SipException e) { | ||
| 968 | -// throw new RuntimeException(e); | ||
| 969 | -// } catch (InvalidArgumentException e) { | ||
| 970 | -// throw new RuntimeException(e); | ||
| 971 | -// } catch (ParseException e) { | ||
| 972 | -// throw new RuntimeException(e); | ||
| 973 | -// } | ||
| 974 | -// }else { | ||
| 975 | - // 流不存在时监听流上线 | ||
| 976 | // 设置等待推流的超时; 默认20s | 887 | // 设置等待推流的超时; 默认20s |
| 977 | String waiteStreamTimeoutTaskKey = "waite-stream-" + device.getDeviceId() + audioBroadcastCatch.getChannelId(); | 888 | String waiteStreamTimeoutTaskKey = "waite-stream-" + device.getDeviceId() + audioBroadcastCatch.getChannelId(); |
| 978 | dynamicTask.startDelay(waiteStreamTimeoutTaskKey, ()->{ | 889 | dynamicTask.startDelay(waiteStreamTimeoutTaskKey, ()->{ |
| 979 | logger.info("等待推流超时: {}/{}", app, stream); | 890 | logger.info("等待推流超时: {}/{}", app, stream); |
| 980 | - subscribe.removeSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey); | 891 | + subscribe.removeSubscribe(subscribeKey); |
| 981 | playService.stopAudioBroadcast(device.getDeviceId(), audioBroadcastCatch.getChannelId()); | 892 | playService.stopAudioBroadcast(device.getDeviceId(), audioBroadcastCatch.getChannelId()); |
| 982 | // 发送bye | 893 | // 发送bye |
| 983 | try { | 894 | try { |
| @@ -992,9 +903,10 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | @@ -992,9 +903,10 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements | ||
| 992 | }, 20*1000); | 903 | }, 20*1000); |
| 993 | 904 | ||
| 994 | boolean finalMediaTransmissionTCP = mediaTransmissionTCP; | 905 | boolean finalMediaTransmissionTCP = mediaTransmissionTCP; |
| 995 | - subscribe.addSubscribe(ZLMHttpHookSubscribe.HookType.on_stream_changed, subscribeKey, | 906 | + subscribe.addSubscribe(subscribeKey, |
| 996 | (MediaServerItem mediaServerItemInUse, JSONObject json)->{ | 907 | (MediaServerItem mediaServerItemInUse, JSONObject json)->{ |
| 997 | logger.info("收到语音对讲推流"); | 908 | logger.info("收到语音对讲推流"); |
| 909 | + dynamicTask.stop(waiteStreamTimeoutTaskKey); | ||
| 998 | MediaItem mediaItem = JSON.toJavaObject(json, MediaItem.class); | 910 | MediaItem mediaItem = JSON.toJavaObject(json, MediaItem.class); |
| 999 | Integer audioCodecId = null; | 911 | Integer audioCodecId = null; |
| 1000 | if (mediaItem.getTracks() != null && mediaItem.getTracks().size() > 0) { | 912 | if (mediaItem.getTracks() != null && mediaItem.getTracks().size() > 0) { |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
| @@ -238,7 +238,7 @@ public class ZLMHttpHookListener { | @@ -238,7 +238,7 @@ public class ZLMHttpHookListener { | ||
| 238 | // 鉴权通过 | 238 | // 鉴权通过 |
| 239 | redisCatchStorage.updateStreamAuthorityInfo(param.getApp(), param.getStream(), streamAuthorityInfo); | 239 | redisCatchStorage.updateStreamAuthorityInfo(param.getApp(), param.getStream(), streamAuthorityInfo); |
| 240 | // 通知assist新的callId | 240 | // 通知assist新的callId |
| 241 | - if (mediaInfo != null) { | 241 | + if (mediaInfo != null && mediaInfo.getRecordAssistPort() > 0) { |
| 242 | assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null); | 242 | assistRESTfulUtils.addStreamCallInfo(mediaInfo, param.getApp(), param.getStream(), callId, null); |
| 243 | } | 243 | } |
| 244 | }else { | 244 | }else { |
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServiceImpl.java
| @@ -69,7 +69,7 @@ public class MediaServiceImpl implements IMediaService { | @@ -69,7 +69,7 @@ public class MediaServiceImpl implements IMediaService { | ||
| 69 | if (authority) { | 69 | if (authority) { |
| 70 | streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, addr,streamAuthorityInfo.getCallId(), true); | 70 | streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, addr,streamAuthorityInfo.getCallId(), true); |
| 71 | }else { | 71 | }else { |
| 72 | - streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, addr,null); | 72 | + streamInfo = getStreamInfoByAppAndStream(mediaInfo, app, stream, tracks, addr,null, true); |
| 73 | } | 73 | } |
| 74 | 74 | ||
| 75 | } | 75 | } |
src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
| @@ -8,6 +8,7 @@ import java.util.UUID; | @@ -8,6 +8,7 @@ import java.util.UUID; | ||
| 8 | 8 | ||
| 9 | import javax.sip.ResponseEvent; | 9 | import javax.sip.ResponseEvent; |
| 10 | 10 | ||
| 11 | +import com.genersoft.iot.vmp.gb28181.bean.*; | ||
| 11 | import org.slf4j.Logger; | 12 | import org.slf4j.Logger; |
| 12 | import org.slf4j.LoggerFactory; | 13 | import org.slf4j.LoggerFactory; |
| 13 | import org.springframework.beans.factory.annotation.Autowired; | 14 | import org.springframework.beans.factory.annotation.Autowired; |
| @@ -23,13 +24,6 @@ import com.genersoft.iot.vmp.common.StreamInfo; | @@ -23,13 +24,6 @@ import com.genersoft.iot.vmp.common.StreamInfo; | ||
| 23 | import com.genersoft.iot.vmp.conf.DynamicTask; | 24 | import com.genersoft.iot.vmp.conf.DynamicTask; |
| 24 | import com.genersoft.iot.vmp.conf.SipConfig; | 25 | import com.genersoft.iot.vmp.conf.SipConfig; |
| 25 | import com.genersoft.iot.vmp.conf.UserSetting; | 26 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 26 | -import com.genersoft.iot.vmp.gb28181.bean.Device; | ||
| 27 | -import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | ||
| 28 | -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamCallback; | ||
| 29 | -import com.genersoft.iot.vmp.gb28181.bean.InviteStreamInfo; | ||
| 30 | -import com.genersoft.iot.vmp.gb28181.bean.ParentPlatform; | ||
| 31 | -import com.genersoft.iot.vmp.gb28181.bean.SendRtpItem; | ||
| 32 | -import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction; | ||
| 33 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; | 27 | import com.genersoft.iot.vmp.gb28181.event.SipSubscribe; |
| 34 | import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager; | 28 | import com.genersoft.iot.vmp.gb28181.session.AudioBroadcastManager; |
| 35 | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; | 29 | import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager; |
web_src/src/components/Login.vue
| @@ -35,6 +35,7 @@ | @@ -35,6 +35,7 @@ | ||
| 35 | 35 | ||
| 36 | <script> | 36 | <script> |
| 37 | import crypto from 'crypto' | 37 | import crypto from 'crypto' |
| 38 | +import Vue from 'vue' | ||
| 38 | export default { | 39 | export default { |
| 39 | name: 'Login', | 40 | name: 'Login', |
| 40 | data(){ | 41 | data(){ |
| @@ -84,11 +85,13 @@ export default { | @@ -84,11 +85,13 @@ export default { | ||
| 84 | url:"/api/user/login", | 85 | url:"/api/user/login", |
| 85 | params: loginParam | 86 | params: loginParam |
| 86 | }).then(function (res) { | 87 | }).then(function (res) { |
| 87 | - console.log(JSON.stringify(res)); | 88 | + console.log(res); |
| 89 | + console.log(res.data.data); | ||
| 88 | if (res.data.code == 0 && res.data.msg == "success") { | 90 | if (res.data.code == 0 && res.data.msg == "success") { |
| 89 | that.$cookies.set("session", {"username": that.username,"roleId":res.data.data.role.id}) ; | 91 | that.$cookies.set("session", {"username": that.username,"roleId":res.data.data.role.id}) ; |
| 90 | //登录成功后 | 92 | //登录成功后 |
| 91 | that.cancelEnterkeyDefaultAction(); | 93 | that.cancelEnterkeyDefaultAction(); |
| 94 | + Vue.prototype.$loginUser = res.data.data | ||
| 92 | that.$router.push('/'); | 95 | that.$router.push('/'); |
| 93 | }else{ | 96 | }else{ |
| 94 | that.isLoging = false; | 97 | that.isLoging = false; |
web_src/src/components/dialog/devicePlayer.vue
| @@ -298,6 +298,7 @@ | @@ -298,6 +298,7 @@ | ||
| 298 | 298 | ||
| 299 | <script> | 299 | <script> |
| 300 | import rtcPlayer from '../dialog/rtcPlayer.vue' | 300 | import rtcPlayer from '../dialog/rtcPlayer.vue' |
| 301 | +import crypto from 'crypto' | ||
| 301 | // import LivePlayer from '@liveqing/liveplayer' | 302 | // import LivePlayer from '@liveqing/liveplayer' |
| 302 | // import player from '../dialog/easyPlayer.vue' | 303 | // import player from '../dialog/easyPlayer.vue' |
| 303 | import jessibucaPlayer from '../common/jessibuca.vue' | 304 | import jessibucaPlayer from '../common/jessibuca.vue' |
| @@ -861,6 +862,10 @@ export default { | @@ -861,6 +862,10 @@ export default { | ||
| 861 | } | 862 | } |
| 862 | }, | 863 | }, |
| 863 | startBroadcast(url){ | 864 | startBroadcast(url){ |
| 865 | + // 获取推流鉴权KEY | ||
| 866 | + console.log(this.$loginUser) | ||
| 867 | + console.log(this.$loginUser.pushKey) | ||
| 868 | + url += "&sign=" + crypto.createHash('md5').update(this.$loginUser.pushKey, "utf8").digest('hex') | ||
| 864 | console.log("开始语音对讲: " + url) | 869 | console.log("开始语音对讲: " + url) |
| 865 | this.broadcastRtc = new ZLMRTCClient.Endpoint({ | 870 | this.broadcastRtc = new ZLMRTCClient.Endpoint({ |
| 866 | debug: true, // 是否打印日志 | 871 | debug: true, // 是否打印日志 |