VideoServiceImpl.java 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package com.supervision.web.videoManage.service;
  2. import com.github.pagehelper.PageHelper;
  3. import com.github.pagehelper.PageInfo;
  4. import com.supervision.web.videoManage.domain.Video;
  5. import com.supervision.web.videoManage.mapper.VideoMapper;
  6. import com.supervision.web.videoManage.other.FFmpegManager;
  7. import com.supervision.web.videoManage.vo.VideoVo;
  8. import lombok.extern.slf4j.Slf4j;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.beans.factory.annotation.Value;
  11. import org.springframework.stereotype.Service;
  12. import java.io.*;
  13. import java.util.*;
  14. import java.util.concurrent.CompletableFuture;
  15. @Slf4j
  16. @Service("VideoService")
  17. public class VideoServiceImpl implements VideoService {
  18. @Value("${video.nginxProxyUrl}")
  19. private String nginxProxyUrl;
  20. // @Value("${video.videoFormat}")
  21. // private String videoFormat;
  22. @Value("${video.videoFilePath}")
  23. private String videoFilePath;
  24. // @Value("${video.cmd}")
  25. // private String ffmpegCmd;
  26. // private CommandUtil commandUtil;
  27. // private int i;
  28. /** 注入Mapper用于数据库访问 */
  29. @Autowired
  30. private VideoMapper videoMapper;
  31. // FFmpegManager 作为单例
  32. private final FFmpegManager ffmpegManager;
  33. // 构造函数注入 FFmpegManager
  34. @Autowired
  35. public VideoServiceImpl(FFmpegManager ffmpegManager) {
  36. this.ffmpegManager = ffmpegManager;
  37. }
  38. /** 查询所有视频 */
  39. @Override
  40. public List<Video> listAll() {
  41. return videoMapper.searchAll();
  42. }
  43. /**
  44. * 分页查询所有视频,并在需要时生成 m3u8 播放流文件
  45. * @param page 页码(从1开始)
  46. * @param size 每页数量
  47. * @param name 视频名称(模糊查询)
  48. * @return 当前页的视频列表(含播放URL)
  49. */
  50. @Override
  51. public PageInfo<Video> listAllPaged(Map<String, Object> params) {
  52. int page = (int) params.getOrDefault("page", 1);
  53. int size = (int) params.getOrDefault("size", 10);
  54. String name = (String) params.getOrDefault("name", null);
  55. String deviceType = (String) params.getOrDefault("deviceType", null);
  56. PageHelper.startPage(page, size);
  57. List<Video> list = videoMapper.searchByCondition(name, deviceType);
  58. for (Video video : list) {
  59. String cameraId = video.getId() + "_" + video.getChannel();
  60. video.setPlayUrl(ffmpegManager.getPlayUrl(cameraId));
  61. }
  62. return new PageInfo<>(list);
  63. }
  64. /**
  65. * 分页查询所有视频,并在需要时生成 m3u8 播放流文件
  66. * @param pageNum 页码(从1开始)
  67. * @param pageSize 每页数量
  68. * @param name 视频名称(模糊查询)
  69. * @return 当前页的视频列表(含播放URL)
  70. */
  71. @Override
  72. public List<Video> listVideoAllPaged(int pageNum, int pageSize, String name) {
  73. PageHelper.startPage(pageNum, pageSize);
  74. return videoMapper.searchByName(name);
  75. }
  76. /** 根据ID查询视频设备 */
  77. @Override
  78. public Video getById(Long id) {
  79. return videoMapper.searchById(id);
  80. }
  81. /** 新增视频设备 */
  82. @Override
  83. public int add(Video video) {
  84. return videoMapper.insert(video);
  85. }
  86. /** 更新视频设备 */
  87. @Override
  88. public int update(Video video) {
  89. return videoMapper.update(video);
  90. }
  91. /** 删除视频设备 */
  92. @Override
  93. public int delete(Long id) {
  94. return videoMapper.deleteById(id);
  95. }
  96. /** 按 parentDeviceId 查询门禁/多通道视频 */
  97. @Override
  98. public List<Video> listByParentDeviceId(Long parentDeviceId) {
  99. return videoMapper.searchByParentDeviceId(parentDeviceId);
  100. }
  101. @Override
  102. public List<VideoVo> getSubjectVideo(String subjectName) {
  103. // List<Map<String,String>> urlAndNameList = videoMapper.getSubjectVideoUrl(subjectName);
  104. // List<VideoVo> videoList = new ArrayList<>();
  105. // i=0;
  106. // commandUtil = new CommandUtil();
  107. // urlAndNameList.forEach(item->{
  108. // VideoVo videoVo = new VideoVo();
  109. // videoVo.setName(item.get("name"));
  110. //// videoVo.setUrl(item.get("url"));
  111. //// videoVo.setUrl("http://localhost:8080/"+subjectName+String.valueOf(i)+".m3u8");
  112. // videoVo.setUrl(String.format("%s%s%s%s", nginxProxyUrl, subjectName, i, videoFormat));
  113. // boolean ism3u8Exist = isM3u8Exist(String.format("%s%s%s%s", videoFilePath, subjectName, i, videoFormat));
  114. //
  115. // if (!ism3u8Exist) {
  116. // String cmd = String.format("%s%s%s%s%s", ffmpegCmd.replace("rtspUrl", item.get("url")), videoFilePath, subjectName, i, videoFormat);
  117. // commandUtil.winExec(cmd);
  118. // }
  119. //
  120. // videoList.add(videoVo);
  121. // i++;
  122. // });
  123. // return videoList;
  124. return new ArrayList<>();
  125. }
  126. private boolean isM3u8Exist(String m3u8Path) {
  127. return new File(m3u8Path).exists();
  128. }
  129. @Override
  130. public List<VideoVo> getSystemVideo(String systemId) {
  131. // List<Map<String,String>> urlAndNameList = videoMapper.getSystemVideoUrl(systemId);
  132. // List<VideoVo> videoList = new ArrayList<>();
  133. // urlAndNameList.forEach(item->{
  134. // VideoVo videoVo = new VideoVo();
  135. // videoVo.setName(item.get("name"));
  136. // videoVo.setUrl(item.get("url"));
  137. // videoList.add(videoVo);
  138. // });
  139. //
  140. // return videoList;
  141. return new ArrayList<>();
  142. }
  143. /** 删除本地 ts 文件缓存 */
  144. @Override
  145. public Boolean deleteTsFile() {
  146. File dir = new File(videoFilePath);
  147. boolean res = true;
  148. if (dir.exists() && dir.isDirectory()) {
  149. for (File f : Objects.requireNonNull(dir.listFiles())) {
  150. if (f.isFile() && f.getName().endsWith(".ts")) {
  151. if (f.delete()) {
  152. log.info("删除文件{}成功", f.getAbsolutePath());
  153. } else {
  154. log.warn("删除文件{}失败", f.getAbsolutePath());
  155. res = false;
  156. }
  157. }
  158. }
  159. }
  160. return res;
  161. }
  162. }