@ -3,11 +3,15 @@ package com.genersoft.iot.vmp.service.impl;
import com.alibaba.fastjson.JSON ;
import com.alibaba.fastjson.JSONObject ;
import com.alibaba.fastjson.TypeReference ;
import com.genersoft.iot.vmp.common.StreamInfo ;
import com.genersoft.iot.vmp.conf.UserSetup ;
import com.genersoft.iot.vmp.gb28181.bean.GbStream ;
import com.genersoft.iot.vmp.media.zlm.ZLMHttpHookSubscribe ;
import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils ;
import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig ;
import com.genersoft.iot.vmp.media.zlm.dto.MediaItem ;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem ;
import com.genersoft.iot.vmp.media.zlm.dto.OriginType ;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem ;
import com.genersoft.iot.vmp.service.IMediaServerService ;
import com.genersoft.iot.vmp.service.IStreamPushService ;
@ -20,10 +24,7 @@ import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.stereotype.Service ;
import java.util.ArrayList ;
import java.util.HashMap ;
import java.util.List ;
import java.util.Map ;
import java.util.* ;
@Service
public class StreamPushServiceImpl implements IStreamPushService {
@ -43,6 +44,9 @@ public class StreamPushServiceImpl implements IStreamPushService {
@Autowired
private IRedisCatchStorage redisCatchStorage ;
@Autowired
private UserSetup userSetup ;
@Autowired
private IMediaServerService mediaServerService ;
@ -56,7 +60,9 @@ public class StreamPushServiceImpl implements IStreamPushService {
for ( MediaItem item : mediaItems ) {
// 不保存国标推理以及拉流代理的流
if ( item . getOriginType ( ) = = 1 | | item . getOriginType ( ) = = 2 | | item . getOriginType ( ) = = 8 ) {
if ( item . getOriginType ( ) = = OriginType . RTSP_PUSH . ordinal ( )
| | item . getOriginType ( ) = = OriginType . RTMP_PUSH . ordinal ( )
| | item . getOriginType ( ) = = OriginType . RTC_PUSH . ordinal ( ) ) {
String key = item . getApp ( ) + "_" + item . getStream ( ) ;
StreamPushItem streamPushItem = result . get ( key ) ;
if ( streamPushItem = = null ) {
@ -97,6 +103,11 @@ public class StreamPushServiceImpl implements IStreamPushService {
return new PageInfo < > ( all ) ;
}
@Override
public List < StreamPushItem > getPushList ( String mediaServerId ) {
return streamPushMapper . selectAllByMediaServerId ( mediaServerId ) ;
}
@Override
public boolean saveToGB ( GbStream stream ) {
stream . setStreamType ( "push" ) ;
@ -137,17 +148,84 @@ public class StreamPushServiceImpl implements IStreamPushService {
}
@Override
public void zlmServerOnline ( ZLMServerConfig zlmServerConfig ) {
// 似乎没啥需要做的
public void zlmServerOnline ( String mediaServerId ) {
// 同步zlm推流信息
MediaServerItem mediaServerItem = mediaServerService . getOne ( mediaServerId ) ;
if ( mediaServerItem = = null ) {
return ;
}
List < StreamPushItem > pushList = getPushList ( mediaServerId ) ;
if ( pushList . size ( ) > 0 ) {
Map < String , StreamPushItem > pushItemMap = new HashMap < > ( ) ;
for ( StreamPushItem streamPushItem : pushList ) {
pushItemMap . put ( streamPushItem . getApp ( ) + streamPushItem . getStream ( ) , streamPushItem ) ;
}
zlmresTfulUtils . getMediaList ( mediaServerItem , ( mediaList - > {
if ( mediaList = = null ) return ;
String dataStr = mediaList . getString ( "data" ) ;
Integer code = mediaList . getInteger ( "code" ) ;
List < StreamPushItem > streamPushItems = null ;
if ( code = = 0 ) {
if ( dataStr ! = null ) {
streamPushItems = handleJSON ( dataStr , mediaServerItem ) ;
}
}
if ( streamPushItems ! = null ) {
for ( StreamPushItem streamPushItem : streamPushItems ) {
pushItemMap . remove ( streamPushItem . getApp ( ) + streamPushItem . getStream ( ) ) ;
}
}
Collection < StreamPushItem > offlinePushItems = pushItemMap . values ( ) ;
if ( offlinePushItems . size ( ) > 0 ) {
String type = "PUSH" ;
streamPushMapper . delAll ( new ArrayList < > ( offlinePushItems ) ) ;
for ( StreamPushItem offlinePushItem : offlinePushItems ) {
JSONObject jsonObject = new JSONObject ( ) ;
jsonObject . put ( "serverId" , userSetup . getServerId ( ) ) ;
jsonObject . put ( "app" , offlinePushItem . getApp ( ) ) ;
jsonObject . put ( "stream" , offlinePushItem . getStream ( ) ) ;
jsonObject . put ( "register" , false ) ;
jsonObject . put ( "mediaServerId" , mediaServerId ) ;
redisCatchStorage . sendStreamChangeMsg ( type , jsonObject ) ;
// 移除redis内流的信息
redisCatchStorage . removeStream ( mediaServerItem . getId ( ) , "PUSH" , offlinePushItem . getApp ( ) , offlinePushItem . getStream ( ) ) ;
}
}
} ) ) ;
}
}
@Override
public void zlmServerOffline ( String mediaServerId ) {
// 移除没有serverId的推流
List < StreamPushItem > streamPushItems = streamPushMapper . selectAllByMediaServerId ( mediaServerId ) ;
// 移除没有GBId的推流
streamPushMapper . deleteWithoutGBId ( mediaServerId ) ;
gbStreamMapper . deleteWithoutGBId ( "push" , mediaServerId ) ;
// 其他的流设置未启用
gbStreamMapper . updateStatusByMediaServerId ( mediaServerId , false ) ;
// 移除redis内流的信息
redisCatchStorage . removeStream ( mediaServerId , "PUSH" ) ;
// 发送流停止消息
String type = "PUSH" ;
// 发送redis消息
List < StreamInfo > streamInfoList = redisCatchStorage . getStreams ( mediaServerId , type ) ;
if ( streamInfoList . size ( ) > 0 ) {
for ( StreamInfo streamInfo : streamInfoList ) {
JSONObject jsonObject = new JSONObject ( ) ;
jsonObject . put ( "serverId" , userSetup . getServerId ( ) ) ;
jsonObject . put ( "app" , streamInfo . getApp ( ) ) ;
jsonObject . put ( "stream" , streamInfo . getStreamId ( ) ) ;
jsonObject . put ( "register" , false ) ;
jsonObject . put ( "mediaServerId" , mediaServerId ) ;
redisCatchStorage . sendStreamChangeMsg ( type , jsonObject ) ;
// 移除redis内流的信息
redisCatchStorage . removeStream ( mediaServerId , type , streamInfo . getApp ( ) , streamInfo . getStreamId ( ) ) ;
}
}
}
@Override
public void clean ( ) {
}
}