|
@@ -1,24 +1,27 @@
|
|
|
package com.zj.controller;
|
|
package com.zj.controller;
|
|
|
|
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Collection;
|
|
import java.util.Collection;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.web.bind.annotation.GetMapping;
|
|
|
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
|
|
|
import com.zj.dto.Camera;
|
|
import com.zj.dto.Camera;
|
|
|
import com.zj.service.CameraRepository;
|
|
import com.zj.service.CameraRepository;
|
|
|
import com.zj.service.MediaService;
|
|
import com.zj.service.MediaService;
|
|
|
-import com.zj.thread.MediaConvert;
|
|
|
|
|
import com.zj.thread.MediaTransfer;
|
|
import com.zj.thread.MediaTransfer;
|
|
|
|
|
+import com.zj.thread.MediaTransferFlvByFFmpeg;
|
|
|
import com.zj.thread.MediaTransferFlvByJavacv;
|
|
import com.zj.thread.MediaTransferFlvByJavacv;
|
|
|
|
|
+import com.zj.vo.CameraVo;
|
|
|
import com.zj.vo.Result;
|
|
import com.zj.vo.Result;
|
|
|
|
|
|
|
|
import cn.hutool.crypto.digest.MD5;
|
|
import cn.hutool.crypto.digest.MD5;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- *
|
|
|
|
|
|
|
+ * api管理接口
|
|
|
|
|
+ * 后续可能改为使用数据库
|
|
|
* @author ZJ
|
|
* @author ZJ
|
|
|
*
|
|
*
|
|
|
*/
|
|
*/
|
|
@@ -30,52 +33,116 @@ public class StreamController {
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private MediaService mediaService;
|
|
private MediaService mediaService;
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 新增流
|
|
|
|
|
+ * @param camera
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
@RequestMapping("add")
|
|
@RequestMapping("add")
|
|
|
public Result add(Camera camera) {
|
|
public Result add(Camera camera) {
|
|
|
String res = cameraRepository.add(camera);
|
|
String res = cameraRepository.add(camera);
|
|
|
- return new Result(res, 200, null);
|
|
|
|
|
|
|
+ return new Result(res, 200, true);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 编辑流
|
|
|
|
|
+ * @param camera
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
@RequestMapping("edit")
|
|
@RequestMapping("edit")
|
|
|
public Result edit(Camera camera) {
|
|
public Result edit(Camera camera) {
|
|
|
String res = cameraRepository.edit(camera);
|
|
String res = cameraRepository.edit(camera);
|
|
|
- return new Result(res, 200, null);
|
|
|
|
|
|
|
+ return new Result(res, 200, true);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 删除流(会停止推流)
|
|
|
|
|
+ * @param camera
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
@RequestMapping("del")
|
|
@RequestMapping("del")
|
|
|
public Result del(Camera camera) {
|
|
public Result del(Camera camera) {
|
|
|
mediaService.closeForApi(camera);
|
|
mediaService.closeForApi(camera);
|
|
|
cameraRepository.del(camera);
|
|
cameraRepository.del(camera);
|
|
|
- return new Result("删除成功", 200, null);
|
|
|
|
|
|
|
+ return new Result("删除成功", 200, true);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 停止推流
|
|
|
|
|
+ * @param camera
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
@RequestMapping("stop")
|
|
@RequestMapping("stop")
|
|
|
public Result stop(Camera camera) {
|
|
public Result stop(Camera camera) {
|
|
|
mediaService.closeForApi(camera);
|
|
mediaService.closeForApi(camera);
|
|
|
- return new Result("停止推流", 200, null);
|
|
|
|
|
|
|
+ return new Result("停止推流", 200, true);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 开始推流
|
|
|
|
|
+ * @param camera
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
@RequestMapping("start")
|
|
@RequestMapping("start")
|
|
|
public Result start(Camera camera) {
|
|
public Result start(Camera camera) {
|
|
|
- mediaService.playForApi(camera);
|
|
|
|
|
- return new Result("开始推流", 200, null);
|
|
|
|
|
|
|
+ boolean playForApi = mediaService.playForApi(camera);
|
|
|
|
|
+ return new Result("开始推流", 200, playForApi);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 开启hls
|
|
|
|
|
+ * @param camera
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ @RequestMapping("startHls")
|
|
|
|
|
+ public Result startHls(Camera camera) {
|
|
|
|
|
+// boolean playForApi = mediaService.playForApi(camera);
|
|
|
|
|
+ return new Result("开始推流", 200, true);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 关闭hls
|
|
|
|
|
+ * @param camera
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ @RequestMapping("stopHls")
|
|
|
|
|
+ public Result stopHls(Camera camera) {
|
|
|
|
|
+// mediaService.closeForApi(camera);
|
|
|
|
|
+ return new Result("停止推流", 200, true);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 列表
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
@RequestMapping("list")
|
|
@RequestMapping("list")
|
|
|
public Result list() {
|
|
public Result list() {
|
|
|
Collection<Camera> values = CameraRepository.cameraMap.values();
|
|
Collection<Camera> values = CameraRepository.cameraMap.values();
|
|
|
|
|
+
|
|
|
|
|
+ List<CameraVo> list = new ArrayList<CameraVo>();
|
|
|
for (Camera camera : values) {
|
|
for (Camera camera : values) {
|
|
|
String digestHex = MD5.create().digestHex(camera.getUrl());
|
|
String digestHex = MD5.create().digestHex(camera.getUrl());
|
|
|
|
|
+
|
|
|
MediaTransfer mediaConvert = MediaService.cameras.get(digestHex);
|
|
MediaTransfer mediaConvert = MediaService.cameras.get(digestHex);
|
|
|
|
|
+
|
|
|
|
|
+ CameraVo cameraVo = new CameraVo();
|
|
|
|
|
+
|
|
|
|
|
+ cameraVo.setUrl(camera.getUrl());
|
|
|
|
|
+ cameraVo.setRemark(camera.getRemark());
|
|
|
if(mediaConvert instanceof MediaTransferFlvByJavacv) {
|
|
if(mediaConvert instanceof MediaTransferFlvByJavacv) {
|
|
|
MediaTransferFlvByJavacv mediaTransferFlvByJavacv = (MediaTransferFlvByJavacv) mediaConvert;
|
|
MediaTransferFlvByJavacv mediaTransferFlvByJavacv = (MediaTransferFlvByJavacv) mediaConvert;
|
|
|
-// MediaConvert mediaConvert = MediaService.cameras.get(digestHex);
|
|
|
|
|
- if(mediaConvert != null) {
|
|
|
|
|
- camera.setEnabledFlv(mediaTransferFlvByJavacv.isRunning());
|
|
|
|
|
- } else {
|
|
|
|
|
- camera.setEnabledFlv(false);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ cameraVo.setEnabledFlv(mediaTransferFlvByJavacv.isRunning());
|
|
|
|
|
+ cameraVo.setMode("javacv");
|
|
|
|
|
+
|
|
|
|
|
+ } if(mediaConvert instanceof MediaTransferFlvByFFmpeg) {
|
|
|
|
|
+ MediaTransferFlvByFFmpeg mediaTransferFlvByFFmpeg = (MediaTransferFlvByFFmpeg) mediaConvert;
|
|
|
|
|
+ cameraVo.setEnabledFlv(mediaTransferFlvByFFmpeg.isRunning());
|
|
|
|
|
+ cameraVo.setMode("ffmpeg");
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ list.add(cameraVo);
|
|
|
}
|
|
}
|
|
|
- return new Result("查询成功", 200, values);
|
|
|
|
|
|
|
+ return new Result("查询成功", 200, list);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|