SsrcUtil.java 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package com.genersoft.iot.vmp.gb28181.session;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Random;
  5. import com.genersoft.iot.vmp.conf.SipConfig;
  6. import com.genersoft.iot.vmp.utils.SpringBeanFactory;
  7. /**
  8. * @Description:SIP信令中的SSRC工具类。SSRC值由10位十进制整数组成的字符串,第一位为0代表实况,为1则代表回放;第二位至第六位由监控域ID的第4位到第8位组成;最后4位为不重复的4个整数
  9. * @author: songww
  10. * @date: 2020年5月10日 上午11:57:57
  11. */
  12. public class SsrcUtil {
  13. private static String ssrcPrefix;
  14. private static List<String> isUsed;
  15. private static List<String> notUsed;
  16. private static void init() {
  17. SipConfig sipConfig = (SipConfig) SpringBeanFactory.getBean("sipConfig");
  18. ssrcPrefix = sipConfig.getSipDomain().substring(3, 8);
  19. isUsed = new ArrayList<String>();
  20. notUsed = new ArrayList<String>();
  21. for (int i = 1; i < 10000; i++) {
  22. if (i < 10) {
  23. notUsed.add("000" + i);
  24. } else if (i < 100) {
  25. notUsed.add("00" + i);
  26. } else if (i < 1000) {
  27. notUsed.add("0" + i);
  28. } else {
  29. notUsed.add(String.valueOf(i));
  30. }
  31. }
  32. }
  33. /**
  34. * 获取视频预览的SSRC值,第一位固定为0
  35. *
  36. */
  37. public static String getPlaySsrc() {
  38. return "0" + getSsrcPrefix() + getSN();
  39. }
  40. /**
  41. * 获取录像回放的SSRC值,第一位固定为1
  42. *
  43. */
  44. public static String getPlayBackSsrc() {
  45. return "1" + getSsrcPrefix() + getSN();
  46. }
  47. /**
  48. * 释放ssrc,主要用完的ssrc一定要释放,否则会耗尽
  49. *
  50. */
  51. public static void releaseSsrc(String ssrc) {
  52. String sn = ssrc.substring(6);
  53. isUsed.remove(sn);
  54. notUsed.add(sn);
  55. }
  56. /**
  57. * 获取后四位数SN,随机数
  58. *
  59. */
  60. private static String getSN() {
  61. String sn = null;
  62. if (notUsed.size() == 0) {
  63. throw new RuntimeException("ssrc已经用完");
  64. } else if (notUsed.size() == 1) {
  65. sn = notUsed.get(0);
  66. } else {
  67. sn = notUsed.get(new Random().nextInt(notUsed.size() - 1));
  68. }
  69. notUsed.remove(0);
  70. isUsed.add(sn);
  71. return sn;
  72. }
  73. private static String getSsrcPrefix() {
  74. if (ssrcPrefix == null) {
  75. init();
  76. }
  77. return ssrcPrefix;
  78. }
  79. }