| package com.ruoyi.media.controller;  | 
|   | 
| import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;  | 
| import com.ruoyi.common.annotation.Anonymous;  | 
| import com.ruoyi.common.core.controller.BaseController;  | 
| import com.ruoyi.common.core.domain.AjaxResult;  | 
| import com.ruoyi.common.core.page.TableDataInfo;  | 
| import com.ruoyi.common.utils.StringUtils;  | 
| import com.ruoyi.common.utils.uuid.IdUtils;  | 
| import com.ruoyi.media.domain.Config;  | 
| import com.ruoyi.media.domain.StreamInfo;  | 
| import com.ruoyi.media.domain.Vtdu;  | 
| import com.ruoyi.media.service.IMediaService;  | 
| import com.ruoyi.media.service.IVtduService;  | 
| import io.swagger.annotations.Api;  | 
| import io.swagger.annotations.ApiOperation;  | 
| import org.springframework.security.access.prepost.PreAuthorize;  | 
| import org.springframework.web.bind.annotation.*;  | 
|   | 
| import javax.annotation.Resource;  | 
| import java.util.List;  | 
| import java.util.Map;  | 
| import java.util.stream.Collectors;  | 
|   | 
| /**  | 
|  * @Description: 流媒体业务  | 
|  * @ClassName: controller  | 
|  * @Author: 刘苏义  | 
|  * @Date: 2023年07月13日9:26  | 
|  * @Version: 1.0  | 
|  **/  | 
| @RestController  | 
| @Api(tags = "流媒体接口")  | 
| @RequestMapping("/media/stream")  | 
| @Anonymous  | 
| public class MediaController extends BaseController {  | 
|     @Resource  | 
|     private IMediaService mediaService;  | 
|     @Resource  | 
|     private IVtduService vtduService;  | 
|   | 
|     /**  | 
|      * 增加通道  | 
|      */  | 
|     @PostMapping()  | 
|     @ApiOperation("增加通道")  | 
|     @PreAuthorize("@ss.hasPermi('media:stream:add')")  | 
|     @ApiOperationSupport(includeParameters = {"streamInfo.name", "streamInfo.rtspSource", "streamInfo.mode", "streamInfo.isCode"}, order = 1)  | 
|     public AjaxResult addPath(@RequestBody StreamInfo streamInfo) {  | 
|         if (StringUtils.isEmpty(streamInfo.getName())) {  | 
|             return AjaxResult.error("通道名称不能为空");  | 
|         }  | 
|         if (StringUtils.isEmpty(streamInfo.getRtspSource())) {  | 
|             return AjaxResult.error("rtsp地址不能为空");  | 
|         }  | 
|         Map<String, String> map = mediaService.addPath(streamInfo.getName(), streamInfo.getRtspSource(), streamInfo.getMode(), streamInfo.getIsCode());  | 
|         map.get("rtspUrl");  | 
|         Vtdu vtdu = new Vtdu();  | 
|         vtdu.setName(streamInfo.getName());  | 
|         vtdu.setRtspSource(streamInfo.getRtspSource());  | 
|         vtdu.setIsCode(streamInfo.getIsCode());  | 
|         vtdu.setMode(streamInfo.getMode());  | 
|         vtdu.setRtspUrl(map.get("rtspUrl"));  | 
|         vtdu.setRtmpUrl(map.get("rtmpUrl"));  | 
|         vtdu.setWebrtcUrl(map.get("webrtcUrl"));  | 
|         vtduService.insertVtdu(vtdu);  | 
|         return AjaxResult.success(map);  | 
|     }  | 
|   | 
|   | 
|     /**  | 
|      * 修改通道  | 
|      */  | 
|     @ApiOperation("修改通道")  | 
|     @ApiOperationSupport(includeParameters = {"streamInfo.name", "streamInfo.rtspSource", "streamInfo.mode", "streamInfo.isCode"}, order = 2)  | 
|     @PreAuthorize("@ss.hasPermi('media:stream:edit')")  | 
|     @PutMapping  | 
|     public AjaxResult edit(@RequestBody StreamInfo streamInfo) {  | 
|         Map<String, String> map = mediaService.editPath(streamInfo.getName(), streamInfo.getRtspSource(), streamInfo.getMode(), streamInfo.getIsCode());  | 
|         Vtdu vtdu = new Vtdu();  | 
|         vtdu.setName(streamInfo.getName());  | 
|         vtdu.setRtspSource(streamInfo.getRtspSource());  | 
|         vtdu.setIsCode(streamInfo.getIsCode());  | 
|         vtdu.setMode(streamInfo.getMode());  | 
|         vtdu.setRtspUrl(map.get("rtspUrl"));  | 
|         vtdu.setRtmpUrl(map.get("rtmpUrl"));  | 
|         vtdu.setWebrtcUrl(map.get("webrtcUrl"));  | 
|         vtduService.updateVtdu(vtdu);  | 
|         //vtduService.deleteVtduByName(vtdu.getName());  | 
|         //vtduService.insertVtdu(vtdu);  | 
|         return AjaxResult.success(map);  | 
|     }  | 
|   | 
|     /**  | 
|      * 移除通道  | 
|      */  | 
|     @DeleteMapping("/path/{names}")  | 
|     @PreAuthorize("@ss.hasPermi('media:stream:remove')")  | 
|     @ApiOperation("移除通道")  | 
|     @ApiOperationSupport(order = 3)  | 
|     public AjaxResult removePath(@PathVariable String[] names) {  | 
|         mediaService.removePath(names);  | 
|         vtduService.deleteVtduByNames(names);  | 
|         return AjaxResult.success();  | 
|     }  | 
|   | 
|     /**  | 
|      * 移除拉流  | 
|      */  | 
|     @ApiOperation("移除拉流")  | 
|     @ApiOperationSupport(order =4 )  | 
|     @PreAuthorize("@ss.hasPermi('media:stream:remove')")  | 
|     @DeleteMapping("/{sessionId}")  | 
|     public AjaxResult removePullStreamSession(@PathVariable String sessionId) {  | 
|         List<StreamInfo> pullStreamList = mediaService.getPullStreamList();  | 
|         StreamInfo streamInfo = pullStreamList.stream()  | 
|                 .filter(object -> object.getId().equals(sessionId))  | 
|                 .collect(Collectors.toList()).get(0);  | 
|         switch (streamInfo.getSessionType()) {  | 
|             case "rtsp":  | 
|                 return AjaxResult.success(mediaService.kickRtspSession(sessionId));  | 
|             case "webrtc":  | 
|                 return AjaxResult.success(mediaService.kickWebrtcSession(sessionId));  | 
|             case "rtmp":  | 
|                 return AjaxResult.success(mediaService.kickRtmpSession(sessionId));  | 
|         }  | 
|         return AjaxResult.error();  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取通道详细信息  | 
|      */  | 
|     @ApiOperation("获取通道详细信息")  | 
|     @ApiOperationSupport(order =4 )  | 
|     @GetMapping(value = "/{name}")  | 
|     public AjaxResult getInfo(@PathVariable("name") String name) {  | 
|         return success(mediaService.getPathInfo(name));  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取当前通道列表  | 
|      */  | 
|     @GetMapping("/path/list")  | 
|     @ApiOperation("获取当前通道列表")  | 
|     @ApiOperationSupport(order = 5)  | 
|     public TableDataInfo getPaths() {  | 
|         startPage();  | 
|         return getDataTable(mediaService.paths());  | 
|     }  | 
|   | 
|     /**  | 
|      * 按ID查询拉流详情  | 
|      */  | 
|     @GetMapping("/getRtspSessionById")  | 
|     @ApiOperation("按ID查询拉流详情")  | 
|     public AjaxResult getRtspSessionById(String sessionId) {  | 
|         List<StreamInfo> pullStreamList = mediaService.getPullStreamList();  | 
|         StreamInfo streamInfo = pullStreamList.stream()  | 
|                 .filter(object -> object.getId().equals(sessionId))  | 
|                 .collect(Collectors.toList()).get(0);  | 
|         switch (streamInfo.getSessionType()) {  | 
|             case "rtsp":  | 
|                 return AjaxResult.success(mediaService.getRtspSessionById(sessionId));  | 
|             case "rtmp":  | 
|                 return AjaxResult.success(mediaService.getRtmpSessionById(sessionId));  | 
|             case "webrtc":  | 
|                 return AjaxResult.success(mediaService.getWebrtcSessionById(sessionId));  | 
|         }  | 
|         return AjaxResult.error();  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取推流列表  | 
|      */  | 
|     @PreAuthorize("@ss.hasPermi('media:stream:list')")  | 
|     @GetMapping("/pushList")  | 
|     @ApiOperation("获取推流列表")  | 
|     @ApiOperationSupport(order = 6)  | 
|     public TableDataInfo getPushStreamList() {  | 
|         startPage();  | 
|         return getDataTable(mediaService.getPushStreamList());  | 
|     }  | 
|   | 
|     /**  | 
|      * 获取拉流列表  | 
|      */  | 
|     @PreAuthorize("@ss.hasPermi('media:stream:list')")  | 
|     @GetMapping("/pullList")  | 
|     @ApiOperation("获取拉流列表")  | 
|     @ApiOperationSupport(order = 7)  | 
|     public TableDataInfo getPullStreamList() {  | 
|         startPage();  | 
|         return getDataTable(mediaService.getPullStreamList());  | 
|     }  | 
|   | 
|     /**  | 
|      * 配置流媒体参数  | 
|      */  | 
|     @PostMapping("/setConfig")  | 
|     @ApiOperation("配置流媒体参数")  | 
|     @ApiOperationSupport(order = 8)  | 
|     public AjaxResult setConfig(@RequestBody Config config) {  | 
|         return AjaxResult.success(mediaService.setConfig(config));  | 
|     }  | 
| }  |