StreamProxyServiceImpl.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package com.genersoft.iot.vmp.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.genersoft.iot.vmp.common.StreamInfo;
  4. import com.genersoft.iot.vmp.gb28181.bean.GbStream;
  5. import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
  6. import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
  7. import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
  8. import com.genersoft.iot.vmp.service.IGbStreamService;
  9. import com.genersoft.iot.vmp.service.IMediaServerService;
  10. import com.genersoft.iot.vmp.service.IMediaService;
  11. import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
  12. import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
  13. import com.genersoft.iot.vmp.storager.dao.GbStreamMapper;
  14. import com.genersoft.iot.vmp.storager.dao.PlatformGbStreamMapper;
  15. import com.genersoft.iot.vmp.storager.dao.StreamProxyMapper;
  16. import com.genersoft.iot.vmp.service.IStreamProxyService;
  17. import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
  18. import com.github.pagehelper.PageInfo;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import java.util.ArrayList;
  24. import java.util.List;
  25. /**
  26. * 视频代理业务
  27. */
  28. @Service
  29. public class StreamProxyServiceImpl implements IStreamProxyService {
  30. private final static Logger logger = LoggerFactory.getLogger(StreamProxyServiceImpl.class);
  31. @Autowired
  32. private IVideoManagerStorager videoManagerStorager;
  33. @Autowired
  34. private IMediaService mediaService;
  35. @Autowired
  36. private ZLMRESTfulUtils zlmresTfulUtils;;
  37. @Autowired
  38. private StreamProxyMapper streamProxyMapper;
  39. @Autowired
  40. private GbStreamMapper gbStreamMapper;
  41. @Autowired
  42. private PlatformGbStreamMapper platformGbStreamMapper;
  43. @Autowired
  44. private IGbStreamService gbStreamService;
  45. @Autowired
  46. private IMediaServerService mediaServerService;
  47. @Override
  48. public WVPResult<StreamInfo> save(StreamProxyItem param) {
  49. MediaServerItem mediaInfo;
  50. WVPResult<StreamInfo> wvpResult = new WVPResult<>();
  51. wvpResult.setCode(0);
  52. if ("auto".equals(param.getMediaServerId())){
  53. mediaInfo = mediaServerService.getMediaServerForMinimumLoad();
  54. }else {
  55. mediaInfo = mediaServerService.getOne(param.getMediaServerId());
  56. }
  57. if (mediaInfo == null) {
  58. logger.warn("保存代理未找到在线的ZLM...");
  59. wvpResult.setMsg("保存失败");
  60. return wvpResult;
  61. }
  62. String dstUrl = String.format("rtmp://%s:%s/%s/%s", "127.0.0.1", mediaInfo.getRtmpPort(), param.getApp(),
  63. param.getStream() );
  64. param.setDst_url(dstUrl);
  65. StringBuffer result = new StringBuffer();
  66. boolean streamLive = false;
  67. param.setMediaServerId(mediaInfo.getId());
  68. // 更新
  69. if (videoManagerStorager.queryStreamProxy(param.getApp(), param.getStream()) != null) {
  70. if (videoManagerStorager.updateStreamProxy(param)) {
  71. result.append("保存成功");
  72. if (param.isEnable()){
  73. JSONObject jsonObject = addStreamProxyToZlm(param);
  74. if (jsonObject == null) {
  75. result.append(", 但是启用失败,请检查流地址是否可用");
  76. param.setEnable(false);
  77. videoManagerStorager.updateStreamProxy(param);
  78. }else {
  79. StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(
  80. mediaInfo, param.getApp(), param.getStream(), null);
  81. wvpResult.setData(streamInfo);
  82. }
  83. }
  84. }
  85. }else { // 新增
  86. if (videoManagerStorager.addStreamProxy(param)){
  87. result.append("保存成功");
  88. streamLive = true;
  89. if (param.isEnable()) {
  90. JSONObject jsonObject = addStreamProxyToZlm(param);
  91. if (jsonObject == null) {
  92. streamLive = false;
  93. result.append(", 但是启用失败,请检查流地址是否可用");
  94. param.setEnable(false);
  95. videoManagerStorager.updateStreamProxy(param);
  96. }else {
  97. StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStream(
  98. mediaInfo, param.getApp(), param.getStream(), null);
  99. wvpResult.setData(streamInfo);
  100. }
  101. }
  102. }else {
  103. result.append("保存失败");
  104. }
  105. }
  106. if (param.getPlatformGbId() != null && streamLive) {
  107. List<GbStream> gbStreams = new ArrayList<>();
  108. gbStreams.add(param);
  109. if (gbStreamService.addPlatformInfo(gbStreams, param.getPlatformGbId())){
  110. result.append(", 关联国标平台[ " + param.getPlatformGbId() + " ]成功");
  111. }else {
  112. result.append(", 关联国标平台[ " + param.getPlatformGbId() + " ]失败");
  113. }
  114. }
  115. wvpResult.setMsg(result.toString());
  116. return wvpResult;
  117. }
  118. @Override
  119. public JSONObject addStreamProxyToZlm(StreamProxyItem param) {
  120. JSONObject result = null;
  121. MediaServerItem mediaServerItem = null;
  122. if (param.getMediaServerId() == null) {
  123. logger.warn("添加代理时MediaServerId 为null");
  124. return null;
  125. }else {
  126. mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
  127. }
  128. if ("default".equals(param.getType())){
  129. result = zlmresTfulUtils.addStreamProxy(mediaServerItem, param.getApp(), param.getStream(), param.getUrl(),
  130. param.isEnable_hls(), param.isEnable_mp4(), param.getRtp_type());
  131. }else if ("ffmpeg".equals(param.getType())) {
  132. result = zlmresTfulUtils.addFFmpegSource(mediaServerItem, param.getSrc_url(), param.getDst_url(),
  133. param.getTimeout_ms() + "", param.isEnable_hls(), param.isEnable_mp4(),
  134. param.getFfmpeg_cmd_key());
  135. }
  136. return result;
  137. }
  138. @Override
  139. public JSONObject removeStreamProxyFromZlm(StreamProxyItem param) {
  140. if (param ==null) return null;
  141. MediaServerItem mediaServerItem = mediaServerService.getOne(param.getMediaServerId());
  142. JSONObject result = zlmresTfulUtils.closeStreams(mediaServerItem, param.getApp(), param.getStream());
  143. return result;
  144. }
  145. @Override
  146. public PageInfo<StreamProxyItem> getAll(Integer page, Integer count) {
  147. return videoManagerStorager.queryStreamProxyList(page, count);
  148. }
  149. @Override
  150. public void del(String app, String stream) {
  151. StreamProxyItem streamProxyItem = videoManagerStorager.queryStreamProxy(app, stream);
  152. if (streamProxyItem != null) {
  153. videoManagerStorager.deleteStreamProxy(app, stream);
  154. JSONObject jsonObject = removeStreamProxyFromZlm(streamProxyItem);
  155. if (jsonObject != null && jsonObject.getInteger("code") == 0) {
  156. // 如果关联了国标那么移除关联
  157. gbStreamMapper.del(app, stream);
  158. platformGbStreamMapper.delByAppAndStream(app, stream);
  159. // TODO 如果关联的推流, 那么状态设置为离线
  160. }
  161. }
  162. }
  163. @Override
  164. public boolean start(String app, String stream) {
  165. boolean result = false;
  166. StreamProxyItem streamProxy = videoManagerStorager.queryStreamProxy(app, stream);
  167. if (!streamProxy.isEnable() && streamProxy != null) {
  168. JSONObject jsonObject = addStreamProxyToZlm(streamProxy);
  169. if (jsonObject == null) return false;
  170. if (jsonObject.getInteger("code") == 0) {
  171. result = true;
  172. streamProxy.setEnable(true);
  173. videoManagerStorager.updateStreamProxy(streamProxy);
  174. }
  175. }
  176. return result;
  177. }
  178. @Override
  179. public boolean stop(String app, String stream) {
  180. boolean result = false;
  181. StreamProxyItem streamProxyDto = videoManagerStorager.queryStreamProxy(app, stream);
  182. if (streamProxyDto != null && streamProxyDto.isEnable()) {
  183. JSONObject jsonObject = removeStreamProxyFromZlm(streamProxyDto);
  184. if (jsonObject.getInteger("code") == 0) {
  185. streamProxyDto.setEnable(false);
  186. result = videoManagerStorager.updateStreamProxy(streamProxyDto);
  187. }
  188. }
  189. return result;
  190. }
  191. @Override
  192. public JSONObject getFFmpegCMDs(MediaServerItem mediaServerItem) {
  193. JSONObject result = new JSONObject();
  194. JSONObject mediaServerConfigResuly = zlmresTfulUtils.getMediaServerConfig(mediaServerItem);
  195. if (mediaServerConfigResuly != null && mediaServerConfigResuly.getInteger("code") == 0
  196. && mediaServerConfigResuly.getJSONArray("data").size() > 0){
  197. JSONObject mediaServerConfig = mediaServerConfigResuly.getJSONArray("data").getJSONObject(0);
  198. for (String key : mediaServerConfig.keySet()) {
  199. if (key.startsWith("ffmpeg.cmd")){
  200. result.put(key, mediaServerConfig.getString(key));
  201. }
  202. }
  203. }
  204. return result;
  205. }
  206. @Override
  207. public StreamProxyItem getStreamProxyByAppAndStream(String app, String streamId) {
  208. return videoManagerStorager.getStreamProxyByAppAndStream(app, streamId);
  209. }
  210. }