@QAZq-KSw&3d&1=I(aT>ejndU
zdnS>5TG%N#EcU#`YLF#W=&q))4q~~sDitxn9%UGX*s3#dGOg`cG>Xz%nRdqwDUlH)
zWoT;M;?U)=l2lK}hAnE3*SNJn*r%HhY$h
z9P%&^+={l`G)at8+7wO7P}2KYWyBs+dkKwh#V@II>RL36Vducc`qyxOjW0e)z>9TN
zg3rt=;CssNET&y)FWMZ5pG$3&DR!g1FkkzOV(3Yws5&47^2RSIDPG
z{VD7A5h0NGto@#+=E&|O!#|nj&VtYqMwLG!ts-69^M;l$wfQ+k$ahjt=zmqrmJSPs
z#efr+O|e^=HU)N0Q>7EXizOP6kVy#Db}?1kTQ)i2S}WH-f4w$LU$wbY7h_a~XW@YW
zAM;Rl^6iJ*xEO{CRl2w2{V{+02Iu{)TvM*j*s>}9oSt0C=}q~oKYqP52atC~ytK~I
zegeAYHM}ewQM0NPl+H`|m1k06up9@lX<};?Sb>$JeKw|N@hw+_7zjX0ExqrVY}r$S
zef7!pbikV!G3SHJSN49N4o5%lpVP&5>GHOp!f2bok?~F;xiBasOV&;lhraz4p~82p
zmacWpvvNT}@S=goO(z@Cac({17SyL4RwGOC?i_&1ZSq6_eZ+;=
zl@K@?v#5gKmhRzREI@zNebE-CczXDfovm;H*&~w)i|d2w;YJG9{gSShCjbPt1@zce
zn9?Pu@@M)mG1Uomh@pZNx0@dkKe`Dzx)A@TG1U^GP}-b{?$TW8iuvWYLfhWTP+W#t
zxy={6u+j434x9ZF=JvdnnP0#fE;vm9w24}@0S<&mQ3s0nkcg5G@WPD?{~o5!5Ddwm
z1|F#ayuZY_FQtn<*rxT8=RJt~>+D;w9ss2HuH<`kzR}b+sFVO_9|#adBStV`>+)?d
z%+=QSE_AGvO^Ay;WkZ(0C%8_mVWo)@x3z>@8rr=;w*9S_(`5Z$+XBYBP|bmEmaZcD
zO^&h340D*;ybkuT#Pm#;@)eSXoIxj?a^CYw6!#r2N5x3EGvSuC+c=F3Cte^BLjHhE
zltOVH3*hMZWJUN3YE_RvScSC}8oF<6L_?PEp;S_tx15{}YlwTYZqzWeB-qeKXJ|bh
zVMt);2pIL6oFn7X_e6CDUr9SkbH^cH(lR+Rs5bOCd?$cBS0-(}P)hkRGkWn(!|axU
zUl~7GoEy_>%$nk2&(8SAX|9|HAAlo|b^nZx2$c(}0W9_*lg0#{7JPBN9FoD@^-`Hu
zNf}X>4A(qERCfBL&s#)8>IW2&sU@?r6ieavL=PI(XxbczsBrt
z^)=ZT%Sxq+!g^z3f?v79Vgx8pDfIl=XIaxH
zZ6YraFSF6YAwnSvPhPuWAW7?r&NDrbvVu*QpR&|1hNUE%PK)kD9iCF#WL)O0|T-05B0R5hm%PM+E}wPnclDV=8m
z79hq;Wzom;TW2O1`($P}O5Xm8_XrKTlN6q3RmT#wf&l@57bgX#6d1Kfsau*eI#R&_B|~_G`X_h1QQ>%)ELC2Z&}3z0
z_+<;WP;K#1RHM`~kAPYpwbpXQANB^-J0Y&fou(O4Rb}fA%#NH~LswZ?`+5N3{ic>vnm?VST{+tk^+sp!3?X8vUs8
zYGgvG?o=s;t$rPdzLJ?M4`|fOeE6-kjL|2;nsdVTEQ5cH0)I2T)dajJHKRfGH@Ep0
z70*KMJUsx~X2w}m5hxDSx+&IQIOPG;jgHzdWZWx@q~1MEPlZpZDP=Dl348X{ee9rZ
zcNKZk^C1IA)+aoJIx`-J$1B>d-Dm>jhM-gOcg8?q
zVQOPhisyYBM;Um9&j~1VX>x+qY${PJj_rx=vVCuv`rd4jFq`3Km7Fl1
ze2^=lcP5RHUxgWJY)^k-K~Lx!?ggQG7!n@h0G}y~zgF}nB$>O-t`i;v-i|#(g*WWh
zbTeo6OQHGxPFkfM-+;u;tZrqIqI#T9F%&r)Y~!`<)LK=ZPu}QnHp&v>trD{U^ya~K
zk^AY@n-!lxeVsiraK*u9h(@oYl|3$M8zDOTge3l-{c6^M2eG81?yJ+5m=Ki=ie9gp
zx}u{40e>-axY8b@;2IVxIMw=T@MVQs4`Yn{T?hamtCzcpBqxcIdvci?tEa1@myqM#CqNedltx0es?$3
zvb?HT7~vxtPY@Ed<>`@g9n=gA&3@=#5J@k%O}>K;U+;cZXt@O!@O~O^0VMGSTlJEEV
z51+m#ga4qp*?6%5>15QnJ1K+zW{|hv0}1cqT^$t;Jhf1L(A92UgvUAo9*3fT-+q8;
zvW=XH);Px#&Lnb-Usv^@H#&W;QP@NDJmdY+$CN?*1~dQIed+^v`Pv_{Xm&crKQGZK
z9m%Vam@6Nfq4)}_#Hy_%!JfQlonU01aro7hK~kCB{#Yo%PL=5$$0RxEy6|N9^^q;V
zKDsUzWFX*4X{o)D$aRGvMv8SmZ$_Ed_7aW0wU(7i}PYo~k3
zxT(NW(gJ)(twN;ej3;GG94!e(91((OxzHVoHH7jyP^Hc=tCfmLjYw@p$;M%%0))#I
zgEa#g6~5=qQuqYb_ji!Czk}FZYff!1+T)z*yWG|$-g
zTV0F9_7<$I^gfxprs{tE5c>wc>@+X?#$`p_0Y_B`-nQlziNdDKD_xp
zPeV$(5SpM+kn&KkUw=Po?0_;tD-n)-bxM0(Zaq^URsud0R>ple^K!X*T?Koi3gUmp
z3BTBl%zc?4UPT?g8(z4Teo}c$egy7*R6kydp6IWBxB2GR`Ii6WM0^$ZApF=4UH%9G
z_T&>wL_P<1K7T0el|LO6e3d`C$v;?U%}{$E{`8`sy&z53`UpvW^KQSf9_*Oi`8?J6
zKhbk`|M*@XQTQ6h`BZ%62)~=yqaW=6iuGN5@uxn|2~r;A>!*IOSe|nsX#HPrbROil
zb{eO8VK)fBb3B)Uh`#DI@9=ym5FA7n`L%t4|9i^K;`yM`s}AC9f(iuWf&m0X@}H;N
zCq*5HJ(0)Bb;r>)|269l)&N()(L@XusN2ONXp{auw~H0PEf`4OBZ023gYL>f)1M7<
zeSHlt7?_yXPZ$@tsjAD7UEQn9s$5%n?ELeh-dEOI>KB8fzX@}@
zICK7!)JS4B*aeoCyaeM@jrLg$v+|O-=oxP-4c89$OSq%|Xneqk@F8az}?Kra*#N^|7A*g$`&st8K;(`C69YbzFw&nfs>;6fq%|afvAs
zW~3U(lrm7RE=D)O8(WHmJw*aE>^weHX!HAx06rTLjes;ZS)jgsCz4+gMbI9Fy)H2=
zOj*D6R|_+jAi#3y88VHtZCu%1V*ILfFW&BSBFM7T2YYo$F+o%$fXtEXW+$HE6AI#Z
z$6}yOn~p%uOuH^QzPcJMGLn@-#~JSv$?wcQZ_goM+iDa@LgdIHTvDrG>beprIVqT-
z({v&1b}I`bvuh?Bk;{L|W_>$bTW14M5vjlL_E!b7U^p-%Y>Wd`wL|XFE>Y-kby166
zN6`Q}!*g;oZ>cCzYaC{g484up(L<&gHhY4(1RcefG3ZZ~x!0(R&vlA1JgUEfy0(i6b0%{C#vyY#Es!EQTx368M6=&N^V(Ak~cW`X9q8x
zkaTKZ*<8!n`RCo(H1tg$D9mn8KEp~Q-B$Tlc1i#2pi;Y@?rg4hlTZ^&|AgF
zU7>9a)*717@{1zR2*fQ%$pJlpi9>qDaLMhL^F(+|)O_NZ!Zng#2pN$)xeW4nleoky
z@RP{imcl2Y@y=jT4e4QpvOvRadc#~+6i8WP_gnjg?h3ioSB)yu8z;$}%g{FQGa@9E
z&$KNH*10c#ws|_}ab-6PE3`EL0P?mUD%_?W>Cx?eG-E?weGX5pzet+347OqbhTcEP
zDM~%z%aY5PtymlrwGfW@{BsU$KOaRH&PT|mt4Ela7th5l
zEDJORlVpxjMyZTynJ0RtuIEiV@2#|_HUWAHh%RzC6L_pz1AaOc#c;(y0~s%S59Yrl
ztX*zcj)<1o{Su)!YE?b@Z6eVWt%1m#QSM
z>u>4houXMaeTM$gkFaexD9Qxp~`gbTk16jBVQ!E_xa(Yl;jAYWPlyTTyR
z4q-A6i!k6H*xaV#(XFyg4&z=QE$KM(NcG&&VQnADW8&9zM(1{SV_eBne>d`9?KtlEn8h
z!}9cQ75Yb!Xme5Sa%4UUr&i!d0LS{2qPre7FT4sb)`Z}nYV1%;=F
z0oSBoQXNm1Z~-WJ{2dvoZKQBeL%xiQay;~kR1MpD=W(YHP%!VDVNu;`A+`C7LA*}A
zYl;i+H7u8m%1hBa4#Q&Yd7aNC^HDIdD2bM&y&&nCynN!oeBd?NbBUf#<~8k%T|DYz
z=atStsdM0ELS+GHE#-yOJhV|Ld$v>ylZsS<6*ZTnQN+&b;%NifyM8Y0jeN`wyo_?78BYubiThmg8
z4JvF*GF}qxnm~|br-Z#Uo$l!$K3A6`AF;r#*u%(XZ_c4zW|T10wK*_ySk-bVK)qx=
zd%L-N=8$IxTF^-*39tgP8Z-=+m|1^Hl;j{}w^@WnVhhA#w;^;@I0w73z}<4o6K`Rn
z>oPzT{>maFgsNNR^U#CHaQ44TzmHF^hr-{}D^TDGJ(^Z_64_U?7@~~STYA2rB=ZSj
zjVY6CP-9$xIQ!@Sh7I%W0ug3e#XFJy4AJH@seybrYDI7me{0+1|3
zk#1eMHZ{q?-&b1TBDP@cN?_U<)9261HY?{gxtr9$YU|izW7*JliJz&+JYNrp_3Z47
z_H|}o_C}o;!DO^18#H(_Gw9y=($urG}22~
ze|<>qjNsV5D+*RZmzh+%&(k>J);XeVx7^CTZXCG67gJT$8}^#bj#*wNWKl>N#o~R}
zp2kUdc&n8^Ui5p^nHja4?lMJJXfp;EL%c*l{S@B#Nu{3QpA^6f@*{nE
z(M>9XSra-4-e~zzmO__C*EvQ~5kBc0cog|970Ss)Kybnom4(gHAVd*>WJXO0I#{ZW
zB6bnF2o9(3{sm={p}%}LD5;j#k{VF*eL)|+aj%J1Q@)m-1DnE0PSlLU0NLHJa_`ws
z(DyIFOq~f#b!%5JrGP~zR|uiuXG@Las%bq`0x7XSLbQGyH>PegL85Wy{GHy5nLLho
z8Ms`#0kNRA9dWR0gD5}T@6G1NzmRu>r<@Kjkm6mHW7Vzat!j#ql9zLidD$0L8Eenl
zW}S+ud~w2IEgi(JXL5s6?Y}9nlFib?zvQ+N*Ou(tSfn7CEe1FY2}6PP;Tqe6ak!*D
zgHs|t8%yHjF+OrU<6BE82P}$`S~(u-iP?5>J{AgD8+(0lrLp+~Pcrj4$K~|a$?O1e
zzsJbPnf)=utIwbjX#E=__Mo%;$2Yd}>mXx^Nhe|>lzKigxOuZyV!g=PnRgjG*Ai^~
ziWoOF8be1%mu&`Owj
z2lVfju8=W!!fG~@k?YrhQf5m!k{LS)H}gHWi1Zc9aILk9fvC5xXxU$$0t{jLxr5P!
zjY{o!^gb^{7-*>=&0&V|5tzEU?{7*9>gw?VH+bVrNYRy`&f8I@R8F=+mscn
z`+yOIij&ODQQYXzMWh$mhiEx`D8R^`1A5a|9y`BkIm*oF8N(p_l?fAA`c|+?m5&^wmk@RUuRJ{RiR7#D|88FlX$W5Q)Y#x>k%+-y#p6t1sH%x}&z
zWgN781{A#Y<)fg*L&wJ6mv9Ad3P+3KEV70q*pC&lEKOSw3$?2VBRpF4!ex=~sci|5$5gFT0
zqZ%eBP6*ST%2La=oUP1aw
z*fL3vfmZw1TK^|Ho+^;I`$~1%?ecajUC_%$3Ep#@uJZ|3qzd+yeEf-e2(|<(D03V%
z_m697B=f`7vzWh1%0$km90wTKT1dfL^)9QCq@ngV>Fl>;5(3eBuNt?*TXv_ZJd
zElGflcC*3=AhmO)TT^LaU5nsiyDpi_U`L3>!SvojK1ib-fiL5ev^*&%e3gtzp;#Ua80LbwyCRY;%entT
z0p*A;Mi^*aLI{s8OU9iQsLRMkZ;L@Z&k5o@4UOU4GYoTyd}ymcVX(FKvX9b?g_s&A
zKqtmCrRP3B0shX3QbNUXM3GXdb60v@YG9;*(U*|AE&wT;kB3R8d{w+sy-%hHn8uAJ
zu1hCM9)DZzN7akfCG>7Bs9k21P~CN6J`!k)ojW=0NTaMdcNN$+CyfSKZpb&XrIPix
zevSONH1YGjPRcKZM*MqHD?7Vo-}yg*d|hPfR@xMG?wR-QSvDczyhfA!LX0=e>!UtI
zrIXU~5RnRx^VzX^N2Iy#nO3Xony9$(L0|9&-p@OoRYr?EjA*hg4wY)@Hc3l~24U)VUxXWklNM>`5osBStVVuZ(6|
zI{3XX_Yt!KoN4qIEF5Cj(InHwe|Z(MWs(wT$qHeT$KO*jbv8n{^OlJ12K)FNRRn%p
zH5&&=YdF6fQlklsj0{9X$Z(IIV4RtLCbn}a8qaG`DX2C6Hp&n~%@&wRWEbB2GN?FF
z#m6F;i!_JlR$!Vu?VoM;_X;A3ZVQGFe(I)^cFtG*OSghHT=gV7axwbSKqXx?+Hu9M$x0?-XZi8Fj1oGKL?+mIn
z?T?pKY!lfjyy~q`bMAmD&Wv5ipKi`06NFPOMl%kuev9g5^6P4(9jp6XdL(4t1Sx$`
zF^?WlC{
z!f(*sA%|-*D4ht=xyG_pJD&S1=qriTf`dUT_tkSv`}L@~_2LCEw(M
z=yW3yZ5l}g7C}*+n;;J=A4x~RWLvF@1<5e)iI_eJl9x$0fOl0ub*99*?=^r`bmy(hcQCMoig
zkQZy)U#uPEEL=Eag{K2=xxR$|Xz`iil{uNT${d+KlKsCB-zO)vDsmI_I29JeiEt54v5~JxHE}x-wSyc9YeI&Iaszb!K
ziRB>mMu}#7@k&rl{tgzHE`#e*V5Ri1LWTvK>yAI68H)EFHVj(4AMW`|C9ea?|*h*|DA_{{~vk(qZj*sQ5)QP1v3Ak
Z{XeQ84G!_ImjL}|Ndp4`^)UY{`(M(*M_T{@
From ec0ec5eb54723cc9aeabb4f313da2a101ab98bd2 Mon Sep 17 00:00:00 2001
From: 648540858 <648540858@qq.com>
Date: Wed, 7 Sep 2022 16:18:35 +0800
Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B9=B6=E5=8F=91?=
=?UTF-8?q?=E7=82=B9=E6=92=AD=E6=97=B6=E5=8F=AF=E8=83=BD=E5=87=BA=E7=8E=B0?=
=?UTF-8?q?=E7=9A=84rtpServer=E5=BC=80=E5=90=AF=E4=BD=86=E6=98=AF=E8=BF=98?=
=?UTF-8?q?=E6=9C=AA=E6=94=B6=E5=88=B0=E6=B5=81=E7=9A=84=E6=83=85=E5=86=B5?=
=?UTF-8?q?=EF=BC=8C=E7=BC=96=E7=A0=81=E7=B1=BB=E5=9E=8B136=EF=BC=8C137,13?=
=?UTF-8?q?8=E9=BB=98=E8=AE=A4=E5=BC=80=E5=90=AF=E9=9F=B3=E9=A2=91?=
=?UTF-8?q?=E9=80=9A=E9=81=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../transmit/cmd/impl/SIPCommander.java | 4 +--
.../request/impl/InviteRequestProcessor.java | 18 +++++++----
.../iot/vmp/gb28181/utils/XmlUtil.java | 7 ++++-
.../vmp/media/zlm/ZLMRTPServerFactory.java | 4 +++
.../iot/vmp/service/IMediaServerService.java | 2 ++
.../service/impl/MediaServerServiceImpl.java | 13 +++++++-
.../iot/vmp/service/impl/PlayServiceImpl.java | 30 +++++++++++++------
.../vmp/storager/dao/DeviceChannelMapper.java | 14 +++++----
.../impl/VideoManagerStorageImpl.java | 20 ++++++-------
.../iot/vmp/vmanager/user/UserController.java | 1 +
src/main/resources/logback-spring-local.xml | 5 ++++
11 files changed, 85 insertions(+), 33 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
index 4d1e568bc..4c40f54d2 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommander.java
@@ -356,7 +356,7 @@ public class SIPCommander implements ISIPCommander {
// String streamMode = device.getStreamMode().toUpperCase();
logger.info("{} 分配的ZLM为: {} [{}:{}]", stream, mediaServerItem.getId(), mediaServerItem.getIp(), ssrcInfo.getPort());
- HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtmp", mediaServerItem.getId());
+ HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", stream, true, "rtsp", mediaServerItem.getId());
subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{
if (event != null) {
event.response(mediaServerItemInUse, json);
@@ -524,7 +524,7 @@ public class SIPCommander implements ISIPCommander {
CallIdHeader callIdHeader = device.getTransport().equals("TCP") ? tcpSipProvider.getNewCallId()
: udpSipProvider.getNewCallId();
- HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtmp", mediaServerItem.getId());
+ HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", ssrcInfo.getStream(), true, "rtsp", mediaServerItem.getId());
// 添加订阅
subscribe.addSubscribe(hookSubscribe, (MediaServerItem mediaServerItemInUse, JSONObject json)->{
if (hookEvent != null) {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
index a6956dab5..82b3ba407 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/InviteRequestProcessor.java
@@ -16,9 +16,7 @@ import com.genersoft.iot.vmp.gb28181.utils.SipUtils;
import com.genersoft.iot.vmp.media.zlm.ZlmHttpHookSubscribe;
import com.genersoft.iot.vmp.media.zlm.ZLMMediaListManager;
import com.genersoft.iot.vmp.media.zlm.ZLMRTPServerFactory;
-import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
-import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
-import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
+import com.genersoft.iot.vmp.media.zlm.dto.*;
import com.genersoft.iot.vmp.service.IMediaServerService;
import com.genersoft.iot.vmp.service.IPlayService;
import com.genersoft.iot.vmp.service.IStreamProxyService;
@@ -90,6 +88,9 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
@Autowired
private IMediaServerService mediaServerService;
+ @Autowired
+ private ZlmHttpHookSubscribe zlmHttpHookSubscribe;
+
@Autowired
private SIPProcessorObserver sipProcessorObserver;
@@ -400,7 +401,14 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
if (playTransaction != null) {
Boolean streamReady = zlmrtpServerFactory.isStreamReady(mediaServerItem, "rtp", playTransaction.getStream());
if (!streamReady) {
- playTransaction = null;
+ boolean hasRtpServer = mediaServerService.checkRtpServer(mediaServerItem, "rtp", playTransaction.getStream());
+ if (hasRtpServer) {
+ logger.info("[上级点播]已经开启rtpServer但是尚未收到流,开启监听流的到来");
+ HookSubscribeForStreamChange hookSubscribe = HookSubscribeFactory.on_stream_changed("rtp", playTransaction.getStream(), true, "rtsp", mediaServerItem.getId());
+ zlmHttpHookSubscribe.addSubscribe(hookSubscribe, hookEvent);
+ }else {
+ playTransaction = null;
+ }
}
}
if (playTransaction == null) {
@@ -564,7 +572,7 @@ public class InviteRequestProcessor extends SIPRequestProcessorParent implements
} else if ("push".equals(gbStream.getStreamType())) {
if (!platform.isStartOfflinePush()) {
// 平台设置中关闭了拉起离线的推流则直接回复
- responseAck(evt, Response.TEMPORARILY_UNAVAILABLE, "channel unavailable");
+ responseAck(evt, Response.TEMPORARILY_UNAVAILABLE, "channel stream not pushing");
return;
}
// 发送redis消息以使设备上线
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
index 733f78a2e..2d568a1cb 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
@@ -203,6 +203,12 @@ public class XmlUtil {
return null;
}
deviceChannel.setChannelId(channelId);
+ int channelTypeCode = Integer.parseInt(channelId.substring(10, 13));
+ if (channelTypeCode == 136 || channelTypeCode == 137 || channelTypeCode == 138) {
+ deviceChannel.setHasAudio(true);
+ }else {
+ deviceChannel.setHasAudio(false);
+ }
if (event != null && !event.equals(CatalogEvent.ADD) && !event.equals(CatalogEvent.UPDATE)) {
// 除了ADD和update情况下需要识别全部内容,
return deviceChannel;
@@ -396,7 +402,6 @@ public class XmlUtil {
} else {
deviceChannel.setPTZType(Integer.parseInt(XmlUtil.getText(itemDevice, "PTZType")));
}
- deviceChannel.setHasAudio(true); // 默认含有音频,播放时再检查是否有音频及是否AAC
return deviceChannel;
}
}
\ No newline at end of file
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
index 6c70096e6..6caff71c5 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
@@ -96,6 +96,10 @@ public class ZLMRTPServerFactory {
if(rtpInfo.getInteger("code") == 0){
if (rtpInfo.getBoolean("exist")) {
result = rtpInfo.getInteger("local_port");
+ if (result == 0) {
+ // 此时说明rtpServer已经创建但是流还没有推上来
+
+ }
return result;
}
}else if(rtpInfo.getInteger("code") == -2){
diff --git a/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java b/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
index f1163cae0..55a4005fd 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/IMediaServerService.java
@@ -83,4 +83,6 @@ public interface IMediaServerService {
MediaServerItem getDefaultMediaServer();
void updateMediaServerKeepalive(String mediaServerId, JSONObject data);
+
+ boolean checkRtpServer(MediaServerItem mediaServerItem, String rtp, String stream);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
index 64a411aa0..702967d64 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -147,9 +147,11 @@ public class MediaServerServiceImpl implements IMediaServerService {
if (streamId == null) {
streamId = String.format("%08x", Integer.parseInt(ssrc)).toUpperCase();
}
- int rtpServerPort = mediaServerItem.getRtpProxyPort();
+ int rtpServerPort;
if (mediaServerItem.isRtpEnable()) {
rtpServerPort = zlmrtpServerFactory.createRTPServer(mediaServerItem, streamId, ssrcCheck?Integer.parseInt(ssrc):0, port);
+ } else {
+ rtpServerPort = mediaServerItem.getRtpProxyPort();
}
RedisUtil.set(key, mediaServerItem);
return new SSRCInfo(rtpServerPort, ssrc, streamId);
@@ -681,4 +683,13 @@ public class MediaServerServiceImpl implements IMediaServerService {
}
}
}
+
+ @Override
+ public boolean checkRtpServer(MediaServerItem mediaServerItem, String app, String stream) {
+ JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaServerItem, stream);
+ if(rtpInfo.getInteger("code") == 0){
+ return rtpInfo.getBoolean("exist");
+ }
+ return false;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index aa019229e..5abb34254 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -164,17 +164,30 @@ public class PlayServiceImpl implements IPlayService {
JSONObject rtpInfo = zlmresTfulUtils.getRtpInfo(mediaInfo, streamId);
if(rtpInfo.getInteger("code") == 0){
if (rtpInfo.getBoolean("exist")) {
+ int localPort = rtpInfo.getInteger("local_port");
+ if (localPort == 0) {
+ logger.warn("[点播],点播时发现rtpServerC存在,但是尚未开始推流");
+ // 此时说明rtpServer已经创建但是流还没有推上来
+ WVPResult wvpResult = new WVPResult();
+ wvpResult.setCode(ErrorCode.ERROR100.getCode());
+ wvpResult.setMsg("点播已经在进行中,请稍候重试");
+ msg.setData(wvpResult);
- WVPResult wvpResult = new WVPResult();
- wvpResult.setCode(ErrorCode.SUCCESS.getCode());
- wvpResult.setMsg(ErrorCode.SUCCESS.getMsg());
- wvpResult.setData(streamInfo);
- msg.setData(wvpResult);
+ resultHolder.invokeAllResult(msg);
+ return playResult;
+ }else {
+ WVPResult wvpResult = new WVPResult();
+ wvpResult.setCode(ErrorCode.SUCCESS.getCode());
+ wvpResult.setMsg(ErrorCode.SUCCESS.getMsg());
+ wvpResult.setData(streamInfo);
+ msg.setData(wvpResult);
- resultHolder.invokeAllResult(msg);
- if (hookEvent != null) {
- hookEvent.response(mediaServerItem, JSONObject.parseObject(JSON.toJSONString(streamInfo)));
+ resultHolder.invokeAllResult(msg);
+ if (hookEvent != null) {
+ hookEvent.response(mediaServerItem, JSONObject.parseObject(JSON.toJSONString(streamInfo)));
+ }
}
+
}else {
redisCatchStorage.stopPlay(streamInfo);
storager.stopPlay(streamInfo.getDeviceID(), streamInfo.getChannelId());
@@ -187,7 +200,6 @@ public class PlayServiceImpl implements IPlayService {
streamInfo = null;
}
-
}
if (streamInfo == null) {
String streamId = null;
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
index bcebb943f..25745c4c1 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
@@ -143,15 +143,12 @@ public interface DeviceChannelMapper {
@Update(value = {"UPDATE device_channel SET status=0 WHERE deviceId=#{deviceId}"})
void offlineByDeviceId(String deviceId);
- @Update(value = {"UPDATE device_channel SET status=1 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"})
- void online(String deviceId, String channelId);
-
@Insert("")
int batchAdd(List addChannels);
+ @Update(value = {"UPDATE device_channel SET status=1 WHERE deviceId=#{deviceId} AND channelId=#{channelId}"})
+ void online(String deviceId, String channelId);
+
@Update({"