StreamProxyServiceImpl.java 8.5 KB

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