TransferRtspHelper.java 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package com.yunzhi.inte.rtsp;
  2. import com.yunzhi.inte.InteApplication;
  3. import io.netty.channel.group.ChannelGroup;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. import lombok.SneakyThrows;
  8. import lombok.extern.slf4j.Slf4j;
  9. import java.io.IOException;
  10. import java.util.*;
  11. import java.util.concurrent.ExecutorService;
  12. import java.util.concurrent.Executors;
  13. import java.util.concurrent.ScheduledExecutorService;
  14. import java.util.concurrent.TimeUnit;
  15. /**
  16. * 转码
  17. */
  18. @Slf4j
  19. public class TransferRtspHelper {
  20. private static final ScheduledExecutorService SCHEDULE = Executors.newScheduledThreadPool(2);
  21. private static final ExecutorService PROCESS_EXECUTOR = Executors.newCachedThreadPool();
  22. private static Map<String, Transfer> transferMap = new HashMap<>();
  23. /**
  24. * 开启
  25. */
  26. public static synchronized void open(String ip) throws IOException {
  27. Transfer transfer = transferMap.get(ip);
  28. if (transfer == null) {
  29. transfer = new Transfer();
  30. transfer.setIp(ip);
  31. transfer.setStartTime(new Date());
  32. transfer.setContinueTime(new Date());
  33. transfer.setCount(1);
  34. PROCESS_EXECUTOR.submit(new TransferTask(transfer));
  35. transferMap.put(ip, transfer);
  36. } else {
  37. transfer.setContinueTime(new Date());
  38. transfer.incCount();
  39. }
  40. log.info("开始转码:{}", transfer);
  41. }
  42. /**
  43. * 关闭
  44. */
  45. public static synchronized void close(String ip) {
  46. Transfer transfer = transferMap.get(ip);
  47. if (transfer != null) {
  48. transfer.decCount();
  49. if (transfer.getCount() <= 0) {
  50. Process process = transfer.getProcess();
  51. if (process != null && process.isAlive()) {
  52. process.destroy();
  53. }
  54. transferMap.remove(ip);
  55. }
  56. }
  57. log.info("结束转码:{}", transfer);
  58. }
  59. /**
  60. * 若当前有在转码,打印相关信息
  61. */
  62. public static void report() {
  63. Map<String, ChannelGroup> channelGroups = ChannelGroupHolder.getChannelGroups();
  64. transferMap.forEach((k, v) -> {
  65. ChannelGroup group = channelGroups.get(k);
  66. if (group != null && !group.isEmpty()) {
  67. log.info("当前转码中:{}", v);
  68. }
  69. });
  70. }
  71. /**
  72. * 如果没有对应channel,停止转码,如果前端页面还开着,会自动建立回连接
  73. */
  74. public static void clear() {
  75. List<String> toClearIp = new ArrayList<>();
  76. Map<String, ChannelGroup> channelGroups = ChannelGroupHolder.getChannelGroups();
  77. transferMap.forEach((k, v) -> {
  78. ChannelGroup group = channelGroups.get(k);
  79. if (group == null || group.isEmpty()
  80. || System.currentTimeMillis() - v.getContinueTime().getTime() > 1800_000L) {
  81. toClearIp.add(k);
  82. }
  83. });
  84. if (!toClearIp.isEmpty()) {
  85. log.info("关闭以下无效转码:{}", toClearIp);
  86. toClearIp.forEach(TransferRtspHelper::close);
  87. }
  88. }
  89. /**
  90. * 开启定时器
  91. */
  92. public static void schedule() {
  93. SCHEDULE.scheduleAtFixedRate(TransferRtspHelper::report, 1L, 5L, TimeUnit.MINUTES);
  94. SCHEDULE.scheduleAtFixedRate(TransferRtspHelper::clear, 60L, 5L, TimeUnit.SECONDS);
  95. }
  96. @Data
  97. @NoArgsConstructor
  98. @AllArgsConstructor
  99. private static class Transfer {
  100. private String ip;
  101. private Process process;
  102. private int count;
  103. private Date startTime;
  104. private Date continueTime;
  105. public void incCount() {
  106. count++;
  107. }
  108. public void decCount() {
  109. count--;
  110. }
  111. }
  112. @Data
  113. @NoArgsConstructor
  114. @AllArgsConstructor
  115. public static class TransferTask implements Runnable {
  116. private Transfer transfer;
  117. public static FFmpeg fFmpeg;
  118. @SneakyThrows
  119. @Override
  120. public void run() {
  121. try {
  122. String ip = transfer.getIp();
  123. Process process = fFmpeg.run(ip);
  124. transfer.setProcess(process);
  125. } catch (Exception e) {
  126. e.printStackTrace();
  127. }
  128. }
  129. }
  130. }