InitServer.java 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package com.zj.init;
  2. import java.net.InetAddress;
  3. import java.net.InetSocketAddress;
  4. import java.util.List;
  5. import javax.annotation.PostConstruct;
  6. import org.bytedeco.javacpp.Loader;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.beans.factory.annotation.Value;
  9. import org.springframework.boot.CommandLineRunner;
  10. import org.springframework.core.env.Environment;
  11. import org.springframework.stereotype.Component;
  12. import com.zj.common.MediaConstant;
  13. import com.zj.dto.CameraDto;
  14. import com.zj.entity.Camera;
  15. import com.zj.mapper.CameraMapper;
  16. import com.zj.server.MediaServer;
  17. import com.zj.service.HlsService;
  18. import com.zj.service.MediaService;
  19. import com.zj.thread.MediaListenThread;
  20. import cn.hutool.core.thread.ThreadUtil;
  21. import cn.hutool.core.util.StrUtil;
  22. import lombok.extern.slf4j.Slf4j;
  23. /**
  24. * 启动流媒体
  25. *
  26. * @author ZJ
  27. *
  28. */
  29. @Slf4j
  30. @Component
  31. public class InitServer implements CommandLineRunner {
  32. @Value("${mediaserver.port}")
  33. private int port;
  34. @Autowired
  35. private MediaServer mediaServer;
  36. @Autowired
  37. private MediaService mediaService;
  38. @Autowired
  39. private HlsService hlsService;
  40. @Autowired
  41. private CameraMapper cameraMapper;
  42. @Autowired
  43. private Environment env;
  44. @Override
  45. public void run(String... args) throws Exception {
  46. initAutoPlay();
  47. ThreadUtil.execute(new MediaListenThread());
  48. String ip = InetAddress.getLocalHost().getHostAddress();
  49. String httpPort = env.getProperty("server.port");
  50. String path = env.getProperty("server.servlet.context-path");
  51. if (StrUtil.isEmpty(path)) {
  52. path = "";
  53. }
  54. log.info("\n--------------------------------------------------------- \n" +
  55. "\t EasyMedia is running! Access address: \n" +
  56. "\t media port at : \t {} \n" +
  57. "\t http port at : \t {} \n" +
  58. "\t web Local: \t http://localhost:{} \n" +
  59. "\t web External: \t http://{}:{}{} \n" +
  60. "\t httpflv: \t http://{}:{}/live?url={您的源地址} \n" +
  61. "\t wsflv: \t ws://{}:{}/live?url={您的源地址} \n" +
  62. "\t hls(m3u8): \t http://{}:{}/hls?url={您的源地址} \n" +
  63. "\t h2-database: \t http://{}:{}/h2-console \n" +
  64. "--------------------------------------------------------- \n",
  65. port,
  66. httpPort,
  67. httpPort,
  68. ip, httpPort, path,
  69. ip, port,
  70. ip, port,
  71. ip, httpPort,
  72. ip, httpPort);
  73. mediaServer.start(new InetSocketAddress("0.0.0.0", port));
  74. }
  75. /**
  76. * 启动初始化自动拉流(已保存的流,如果已经开启,会自动拉流)
  77. */
  78. public void initAutoPlay() {
  79. List<Camera> selectList = cameraMapper.selectList(null);
  80. if (null != selectList && !selectList.isEmpty()) {
  81. log.info("已启动自动拉流!");
  82. for (Camera camera : selectList) {
  83. //已启用的自动拉流,不启用的不自动拉
  84. CameraDto cameraDto = new CameraDto();
  85. cameraDto.setUrl(camera.getUrl());
  86. cameraDto.setAutoClose(false);
  87. cameraDto.setEnabledFFmpeg(camera.getFfmpeg() == 1 ? true : false);
  88. cameraDto.setEnabledFlv(camera.getFlv() == 1 ? true : false);
  89. cameraDto.setEnabledHls(camera.getHls() == 1 ? true : false);
  90. cameraDto.setMediaKey(camera.getMediaKey());
  91. if(camera.getFlv() == 1) {
  92. mediaService.playForApi(cameraDto);
  93. }
  94. if (camera.getHls() == 1) {
  95. hlsService.startConvertToHls(cameraDto);
  96. }
  97. }
  98. }
  99. log.info("您还可以通过restful api添加或删除流!");
  100. }
  101. /**
  102. * 提前初始化,可避免推拉流启动耗时太久
  103. */
  104. @PostConstruct
  105. public void loadFFmpeg() {
  106. //javacv 1.5.5 以上已经优化加载,这边可以省略了
  107. // try {
  108. // log.info("正在初始化资源,请稍等...");
  109. // FFmpegFrameGrabber.tryLoad();
  110. // FFmpegFrameRecorder.tryLoad();
  111. // } catch (org.bytedeco.javacv.FrameGrabber.Exception e) {
  112. // e.printStackTrace();
  113. // } catch (org.bytedeco.javacv.FrameRecorder.Exception e) {
  114. // e.printStackTrace();
  115. // }
  116. /**
  117. * 初始化ffmpeg路径
  118. */
  119. String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
  120. System.setProperty(MediaConstant.ffmpegPathKey, ffmpeg);
  121. log.info("初始化资源成功");
  122. }
  123. }