VideoStreamSessionManager.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. package com.genersoft.iot.vmp.gb28181.session;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import javax.sip.ClientTransaction;
  5. import javax.sip.Dialog;
  6. import com.genersoft.iot.vmp.common.VideoManagerConstants;
  7. import com.genersoft.iot.vmp.conf.UserSetting;
  8. import com.genersoft.iot.vmp.gb28181.bean.SsrcTransaction;
  9. import com.genersoft.iot.vmp.utils.SerializeUtils;
  10. import com.genersoft.iot.vmp.utils.redis.RedisUtil;
  11. import gov.nist.javax.sip.stack.SIPDialog;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.util.StringUtils;
  15. /**
  16. * @description:视频流session管理器,管理视频预览、预览回放的通信句柄
  17. * @author: swwheihei
  18. * @date: 2020年5月13日 下午4:03:02
  19. */
  20. @Component
  21. public class VideoStreamSessionManager {
  22. @Autowired
  23. private RedisUtil redisUtil;
  24. @Autowired
  25. private UserSetting userSetting;
  26. public enum SessionType {
  27. play,
  28. playback,
  29. download
  30. }
  31. /**
  32. * 添加一个点播/回放的事务信息
  33. * 后续可以通过流Id/callID
  34. * @param deviceId 设备ID
  35. * @param channelId 通道ID
  36. * @param callId 一次请求的CallID
  37. * @param stream 流名称
  38. * @param mediaServerId 所使用的流媒体ID
  39. * @param transaction 事务
  40. */
  41. public void put(String deviceId, String channelId, String callId, String stream, String ssrc, String mediaServerId, ClientTransaction transaction, SessionType type){
  42. SsrcTransaction ssrcTransaction = new SsrcTransaction();
  43. ssrcTransaction.setDeviceId(deviceId);
  44. ssrcTransaction.setChannelId(channelId);
  45. ssrcTransaction.setStream(stream);
  46. byte[] transactionByteArray = SerializeUtils.serialize(transaction);
  47. ssrcTransaction.setTransaction(transactionByteArray);
  48. ssrcTransaction.setCallId(callId);
  49. ssrcTransaction.setSsrc(ssrc);
  50. ssrcTransaction.setMediaServerId(mediaServerId);
  51. ssrcTransaction.setType(type);
  52. redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId()
  53. + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction);
  54. redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId()
  55. + "_" + deviceId + "_" + channelId + "_" + callId + "_" + stream, ssrcTransaction);
  56. }
  57. public void put(String deviceId, String channelId, String callId, Dialog dialog){
  58. SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callId, null);
  59. if (ssrcTransaction != null) {
  60. byte[] dialogByteArray = SerializeUtils.serialize(dialog);
  61. ssrcTransaction.setDialog(dialogByteArray);
  62. }
  63. redisUtil.set(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId()
  64. + "_" + deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_"
  65. + ssrcTransaction.getStream(), ssrcTransaction);
  66. }
  67. public ClientTransaction getTransactionByStream(String deviceId, String channelId, String stream){
  68. SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
  69. if (ssrcTransaction == null) {
  70. return null;
  71. }
  72. byte[] transactionByteArray = ssrcTransaction.getTransaction();
  73. ClientTransaction clientTransaction = (ClientTransaction)SerializeUtils.deSerialize(transactionByteArray);
  74. return clientTransaction;
  75. }
  76. public SIPDialog getDialogByStream(String deviceId, String channelId, String stream){
  77. SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
  78. if (ssrcTransaction == null) {
  79. return null;
  80. }
  81. byte[] dialogByteArray = ssrcTransaction.getDialog();
  82. if (dialogByteArray == null) {
  83. return null;
  84. }
  85. SIPDialog dialog = (SIPDialog)SerializeUtils.deSerialize(dialogByteArray);
  86. return dialog;
  87. }
  88. public SIPDialog getDialogByCallId(String deviceId, String channelId, String callID){
  89. SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, callID, null);
  90. if (ssrcTransaction == null) {
  91. return null;
  92. }
  93. byte[] dialogByteArray = ssrcTransaction.getDialog();
  94. if (dialogByteArray == null) {
  95. return null;
  96. }
  97. SIPDialog dialog = (SIPDialog)SerializeUtils.deSerialize(dialogByteArray);
  98. return dialog;
  99. }
  100. public SsrcTransaction getSsrcTransaction(String deviceId, String channelId, String callId, String stream){
  101. if (StringUtils.isEmpty(callId)) {
  102. callId ="*";
  103. }
  104. if (StringUtils.isEmpty(stream)) {
  105. stream ="*";
  106. }
  107. String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream;
  108. List<Object> scanResult = redisUtil.scan(key);
  109. if (scanResult.size() == 0) {
  110. return null;
  111. }
  112. return (SsrcTransaction)redisUtil.get((String) scanResult.get(0));
  113. }
  114. public List<SsrcTransaction> getSsrcTransactionForAll(String deviceId, String channelId, String callId, String stream){
  115. if (StringUtils.isEmpty(deviceId)) {
  116. deviceId ="*";
  117. }
  118. if (StringUtils.isEmpty(channelId)) {
  119. channelId ="*";
  120. }
  121. if (StringUtils.isEmpty(callId)) {
  122. callId ="*";
  123. }
  124. if (StringUtils.isEmpty(stream)) {
  125. stream ="*";
  126. }
  127. String key = VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_" + deviceId + "_" + channelId + "_" + callId+ "_" + stream;
  128. List<Object> scanResult = redisUtil.scan(key);
  129. if (scanResult.size() == 0) {
  130. return null;
  131. }
  132. List<SsrcTransaction> result = new ArrayList<>();
  133. for (Object keyObj : scanResult) {
  134. result.add((SsrcTransaction)redisUtil.get((String) keyObj));
  135. }
  136. return result;
  137. }
  138. public String getMediaServerId(String deviceId, String channelId, String stream){
  139. SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
  140. if (ssrcTransaction == null) {
  141. return null;
  142. }
  143. return ssrcTransaction.getMediaServerId();
  144. }
  145. public String getSSRC(String deviceId, String channelId, String stream){
  146. SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
  147. if (ssrcTransaction == null) {
  148. return null;
  149. }
  150. return ssrcTransaction.getSsrc();
  151. }
  152. public void remove(String deviceId, String channelId, String stream) {
  153. SsrcTransaction ssrcTransaction = getSsrcTransaction(deviceId, channelId, null, stream);
  154. if (ssrcTransaction == null) {
  155. return;
  156. }
  157. redisUtil.del(VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX + userSetting.getServerId() + "_"
  158. + deviceId + "_" + channelId + "_" + ssrcTransaction.getCallId() + "_" + ssrcTransaction.getStream());
  159. }
  160. public List<SsrcTransaction> getAllSsrc() {
  161. List<Object> ssrcTransactionKeys = redisUtil.scan(String.format("%s_*_*_*_*", VideoManagerConstants.MEDIA_TRANSACTION_USED_PREFIX+ userSetting.getServerId() + "_" ));
  162. List<SsrcTransaction> result= new ArrayList<>();
  163. for (int i = 0; i < ssrcTransactionKeys.size(); i++) {
  164. String key = (String)ssrcTransactionKeys.get(i);
  165. SsrcTransaction ssrcTransaction = (SsrcTransaction)redisUtil.get(key);
  166. result.add(ssrcTransaction);
  167. }
  168. return result;
  169. }
  170. }