| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 |
- package com.supervision.web.videoManage.service;
- import com.github.pagehelper.PageHelper;
- import com.github.pagehelper.PageInfo;
- import com.supervision.web.videoManage.domain.Video;
- import com.supervision.web.videoManage.mapper.VideoMapper;
- import com.supervision.web.videoManage.other.FFmpegManager;
- import com.supervision.web.videoManage.vo.VideoVo;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.stereotype.Service;
- import java.io.*;
- import java.util.*;
- import java.util.concurrent.CompletableFuture;
- @Slf4j
- @Service("VideoService")
- public class VideoServiceImpl implements VideoService {
- @Value("${video.nginxProxyUrl}")
- private String nginxProxyUrl;
- // @Value("${video.videoFormat}")
- // private String videoFormat;
- @Value("${video.videoFilePath}")
- private String videoFilePath;
- // @Value("${video.cmd}")
- // private String ffmpegCmd;
- // private CommandUtil commandUtil;
- // private int i;
- /** 注入Mapper用于数据库访问 */
- @Autowired
- private VideoMapper videoMapper;
- // FFmpegManager 作为单例
- private final FFmpegManager ffmpegManager;
- // 构造函数注入 FFmpegManager
- @Autowired
- public VideoServiceImpl(FFmpegManager ffmpegManager) {
- this.ffmpegManager = ffmpegManager;
- }
- /** 查询所有视频 */
- @Override
- public List<Video> listAll() {
- return videoMapper.searchAll();
- }
- /**
- * 分页查询所有视频,并在需要时生成 m3u8 播放流文件
- * @param page 页码(从1开始)
- * @param size 每页数量
- * @param name 视频名称(模糊查询)
- * @return 当前页的视频列表(含播放URL)
- */
- @Override
- public PageInfo<Video> listAllPaged(Map<String, Object> params) {
- int page = (int) params.getOrDefault("page", 1);
- int size = (int) params.getOrDefault("size", 10);
- String name = (String) params.getOrDefault("name", null);
- String deviceType = (String) params.getOrDefault("deviceType", null);
- PageHelper.startPage(page, size);
- List<Video> list = videoMapper.searchByCondition(name, deviceType);
- for (Video video : list) {
- String cameraId = video.getId() + "_" + video.getChannel();
- video.setPlayUrl(ffmpegManager.getPlayUrl(cameraId));
- }
- return new PageInfo<>(list);
- }
- /**
- * 分页查询所有视频,并在需要时生成 m3u8 播放流文件
- * @param pageNum 页码(从1开始)
- * @param pageSize 每页数量
- * @param name 视频名称(模糊查询)
- * @return 当前页的视频列表(含播放URL)
- */
- @Override
- public List<Video> listVideoAllPaged(int pageNum, int pageSize, String name) {
- PageHelper.startPage(pageNum, pageSize);
- return videoMapper.searchByName(name);
- }
- /** 根据ID查询视频设备 */
- @Override
- public Video getById(Long id) {
- return videoMapper.searchById(id);
- }
- /** 新增视频设备 */
- @Override
- public int add(Video video) {
- return videoMapper.insert(video);
- }
- /** 更新视频设备 */
- @Override
- public int update(Video video) {
- return videoMapper.update(video);
- }
- /** 删除视频设备 */
- @Override
- public int delete(Long id) {
- return videoMapper.deleteById(id);
- }
- /** 按 parentDeviceId 查询门禁/多通道视频 */
- @Override
- public List<Video> listByParentDeviceId(Long parentDeviceId) {
- return videoMapper.searchByParentDeviceId(parentDeviceId);
- }
- @Override
- public List<VideoVo> getSubjectVideo(String subjectName) {
- // List<Map<String,String>> urlAndNameList = videoMapper.getSubjectVideoUrl(subjectName);
- // List<VideoVo> videoList = new ArrayList<>();
- // i=0;
- // commandUtil = new CommandUtil();
- // urlAndNameList.forEach(item->{
- // VideoVo videoVo = new VideoVo();
- // videoVo.setName(item.get("name"));
- //// videoVo.setUrl(item.get("url"));
- //// videoVo.setUrl("http://localhost:8080/"+subjectName+String.valueOf(i)+".m3u8");
- // videoVo.setUrl(String.format("%s%s%s%s", nginxProxyUrl, subjectName, i, videoFormat));
- // boolean ism3u8Exist = isM3u8Exist(String.format("%s%s%s%s", videoFilePath, subjectName, i, videoFormat));
- //
- // if (!ism3u8Exist) {
- // String cmd = String.format("%s%s%s%s%s", ffmpegCmd.replace("rtspUrl", item.get("url")), videoFilePath, subjectName, i, videoFormat);
- // commandUtil.winExec(cmd);
- // }
- //
- // videoList.add(videoVo);
- // i++;
- // });
- // return videoList;
- return new ArrayList<>();
- }
- private boolean isM3u8Exist(String m3u8Path) {
- return new File(m3u8Path).exists();
- }
- @Override
- public List<VideoVo> getSystemVideo(String systemId) {
- // List<Map<String,String>> urlAndNameList = videoMapper.getSystemVideoUrl(systemId);
- // List<VideoVo> videoList = new ArrayList<>();
- // urlAndNameList.forEach(item->{
- // VideoVo videoVo = new VideoVo();
- // videoVo.setName(item.get("name"));
- // videoVo.setUrl(item.get("url"));
- // videoList.add(videoVo);
- // });
- //
- // return videoList;
- return new ArrayList<>();
- }
- /** 删除本地 ts 文件缓存 */
- @Override
- public Boolean deleteTsFile() {
- File dir = new File(videoFilePath);
- boolean res = true;
- if (dir.exists() && dir.isDirectory()) {
- for (File f : Objects.requireNonNull(dir.listFiles())) {
- if (f.isFile() && f.getName().endsWith(".ts")) {
- if (f.delete()) {
- log.info("删除文件{}成功", f.getAbsolutePath());
- } else {
- log.warn("删除文件{}失败", f.getAbsolutePath());
- res = false;
- }
- }
- }
- }
- return res;
- }
- }
|