dengyj 3 年 前
コミット
3feef88773

+ 15 - 0
pom.xml

@@ -208,6 +208,16 @@
             <artifactId>hutool-all</artifactId>
             <version>4.6.0</version>
         </dependency>
+        <dependency>
+            <groupId>org.bytedeco</groupId>
+            <artifactId>javacv</artifactId>
+            <version>1.5.4</version>
+        </dependency>
+        <dependency>
+            <groupId>org.bytedeco</groupId>
+            <artifactId>javacv-platform</artifactId>
+            <version>1.5.4</version>
+        </dependency>
         <dependency>
             <groupId>com.wellbole</groupId>
             <artifactId>smsengine-client</artifactId>
@@ -216,6 +226,11 @@
     </dependencies>
 
     <repositories>
+        <repository>
+            <id>maven-public</id>
+            <name>steerinfo maven-releases</name>
+            <url>https://nexus.steerinfo.com/repository/maven-public/</url>
+        </repository>
         <repository>
             <id>maven-releases</id>
             <name>steerinfo maven-releases</name>

+ 192 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/controller/DynamicBaseCameraController.java

@@ -0,0 +1,192 @@
+package com.jisco.dynamicweight.dynamicbasecamera.controller;
+
+import cn.hutool.core.lang.Assert;
+import com.jisco.dynamicweight.dynamicbasebatchstation.model.DynamicBaseBatchStation;
+import com.jisco.dynamicweight.dynamicbasecamera.model.DynamicBaseCamera;
+import com.jisco.dynamicweight.dynamicbasecamera.service.IDynamicBaseCameraService;
+import com.jisco.dynamicweight.dynamicbasecamera.service.IFLVService;
+import com.jisco.dynamicweight.util.ExcelUtil;
+import com.jisco.dynamicweight.util.UserUtil;
+import com.jisco.dynamicweight.util.VideoUtil;
+import com.steerinfo.framework.controller.BaseRESTfulController;
+import com.steerinfo.framework.controller.RESTfulResult;
+import com.steerinfo.framework.service.pagehelper.PageList;
+import com.steerinfo.framework.utils.collection.ListUtils;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.bytedeco.javacv.*;
+import org.bytedeco.opencv.opencv_core.IplImage;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Required;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
+import sun.misc.BASE64Encoder;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.nio.Buffer;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * DynamicBaseCamera RESTful接口:
+ *
+ * @author generator
+ * @version 1.0-SNAPSHORT 2022-02-15 09:14
+ * 类描述
+ * 修订历史:
+ * 日期:2022-02-15
+ * 作者:generator
+ * 参考:
+ * 描述:DynamicBaseCamera RESTful接口
+ * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
+ * @see null
+ */
+@RestController
+@RequestMapping("/${api.version}/dynamicbasecameras")
+public class DynamicBaseCameraController extends BaseRESTfulController {
+
+    @Autowired
+    IDynamicBaseCameraService dynamicBaseCameraService;
+
+    @Autowired
+    IFLVService flvService;
+
+    @ApiOperation(value = "获取列表", notes = "分页查询")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "查询页数", required = false, dataType = "Integer"),
+            @ApiImplicitParam(name = "pageSize", value = "每页记录数", required = false, dataType = "Integer")
+    })
+    //@RequiresPermissions("dynamicbasecamera:view")
+    @GetMapping(value = "/")
+    public RESTfulResult list(@RequestParam HashMap parmas, Integer pageNum, Integer pageSize) {
+        PageList<DynamicBaseCamera> list = dynamicBaseCameraService.queryForPage(parmas, pageNum, pageSize);
+        return success(list);
+    }
+
+    @ApiOperation(value = "获取列表", notes = "分页模糊查询")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "查询页数", required = false, dataType = "Integer"),
+            @ApiImplicitParam(name = "pageSize", value = "每页记录数", required = false, dataType = "Integer")
+    })
+    //@RequiresPermissions("dynamicbasecamera:view")
+    @GetMapping(value = "/like/")
+    public RESTfulResult listLike(@RequestParam HashMap parmas, Integer pageNum, Integer pageSize) {
+        PageList<DynamicBaseCamera> list = dynamicBaseCameraService.queryLikeForPage(parmas, pageNum, pageSize);
+        return success(list);
+    }
+
+    @ApiOperation(value = "创建", notes = "根据DynamicBaseCamera对象创建")
+    @ApiImplicitParam(name = "dynamicBaseCamera", value = "详细实体dynamicBaseCamera", required = true, dataType = "DynamicBaseCamera")
+    //@RequiresPermissions("dynamicbasecamera:create")
+    @PostMapping(value = "/")
+    public RESTfulResult add(@RequestBody DynamicBaseCamera model) {
+        model.setCreateManNo(UserUtil.getCurrentUserId());
+        model.setCreateManName(UserUtil.getCurrentUserName());
+        model.setCreateTime(new Date());
+        DynamicBaseCamera dynamicBaseCamera = dynamicBaseCameraService.add(model);
+        return success(dynamicBaseCamera);
+    }
+
+    @ApiOperation(value = "导出Excel", notes = "导出Excel")
+    @PostMapping(value = "/exportExcel")//String
+    public void exportExcel(HttpServletResponse response) throws IOException {
+        List<DynamicBaseCamera> list = dynamicBaseCameraService.query(null);
+        ExcelUtil.exportExcel(response, list, DynamicBaseCamera.class, "动态秤站点视频配置");
+    }
+
+    @ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
+    @ApiImplicitParam(paramType = "path", name = "id", value = "ID", required = true, dataType = "String")
+    //@RequiresPermissions("dynamicbasecamera:view")
+    @GetMapping(value = "/{id}")
+    public RESTfulResult get(@PathVariable String id) {
+        DynamicBaseCamera dynamicBaseCamera = dynamicBaseCameraService.getById(id);
+        return success(dynamicBaseCamera);
+    }
+
+    @ApiOperation(value = "更新详细信息", notes = "根据url的id来指定更新对象,并根据传过来的dynamicBaseCamera信息来更新详细信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "path", name = "id", value = "ID", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "dynamicBaseCamera", value = "详细实体dynamicBaseCamera", required = true, dataType = "DynamicBaseCamera")
+    })
+    //@RequiresPermissions("dynamicbasecamera:update")
+    @PutMapping(value = "/{id}", produces = "application/json;charset=UTF-8")
+    public RESTfulResult update(@PathVariable String id, @RequestBody DynamicBaseCamera model) {
+        model.setId(id);
+        model.setUpdateManNo(UserUtil.getCurrentUserId());
+        model.setUpdateManName(UserUtil.getCurrentUserName());
+        model.setUpdateTime(new Date());
+        DynamicBaseCamera dynamicBaseCamera = dynamicBaseCameraService.modify(model);
+        return success(dynamicBaseCamera);
+    }
+
+    @ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
+    @ApiImplicitParam(paramType = "path", name = "id", value = "ID", required = true, dataType = "String")
+    //@RequiresPermissions("dynamicbasecamera:delete")
+    @DeleteMapping(value = "/{id}")//String
+    public RESTfulResult delete(@PathVariable String id) {
+        List<String> list = Arrays.asList(id.split(","));
+        if (ListUtils.isNotEmpty(list)) {
+            List<String> ids = ListUtils.convertList(list);
+            dynamicBaseCameraService.delete(ids);
+        }
+        return success();
+    }
+
+    //无需nginx推流服务器,本身服务器够强就行,切可以集群部署
+    @GetMapping(value = "/video/flv/live/", produces = {"video/x-flv;charset=UTF-8"})
+    public void flvLive(@RequestParam(value = "id") String id, @RequestParam(value = "verificationCode") String verificationCode, HttpServletResponse response,
+                        HttpServletRequest request) {
+        DynamicBaseCamera camera = dynamicBaseCameraService.getById(id);
+        String url = VideoUtil.getRTSPUrl(camera);
+        String starttime = request.getParameter("starttime");
+        String endtime = request.getParameter("endtime");
+        if (!StringUtils.isEmpty(starttime) && !StringUtils.isEmpty(endtime)) {
+            //回放
+            url = VideoUtil.getRTSPPlayBackUrl(camera);
+            starttime = starttime.replaceAll("-", "");
+            endtime = endtime.replaceAll("-", "");
+            url += "?starttime=" + starttime + "&endtime=" + endtime;
+        }
+
+        //非网关时开启这里,flvjs插件播放
+        response.setHeader("Access-Control-Allow-Origin", "*");//走网关时去掉这行
+        flvService.open(url, id, response, request);
+    }
+
+    /**
+     * 截图
+     *
+     * @param id
+     * @return java.lang.Object
+     * @author jitwxs
+     * @date 2022/2/15 11:39
+     */
+    @GetMapping("shot")
+    public RESTfulResult shot(@RequestParam String id) throws IOException, InterruptedException {
+//        long start = System.currentTimeMillis();
+        DynamicBaseCamera camera = dynamicBaseCameraService.getById(id);
+        if (Objects.isNull(camera)) return failed(null, "未查询到摄像头配置信息");
+        String url = VideoUtil.getRTSPUrl(camera);
+        FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber(url);
+        fFmpegFrameGrabber.start();
+        fFmpegFrameGrabber.getAudioChannels();
+        Frame frame = fFmpegFrameGrabber.grabImage();
+        Java2DFrameConverter java2DFrameConverter = new Java2DFrameConverter();
+        BufferedImage bufferedImage = java2DFrameConverter.convert(frame);
+        fFmpegFrameGrabber.stop();
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
+        ImageIO.write(bufferedImage, "jpeg", baos);//写入流中
+        byte[] bytes = baos.toByteArray();//转换成字节
+        BASE64Encoder encoder = new BASE64Encoder();
+        String jpg_base64 = encoder.encodeBuffer(bytes).trim();//转换成base64串
+        jpg_base64 = jpg_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
+        return success("data:image/jpeg;base64," + jpg_base64);
+    }
+}

+ 39 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/factories/Converter.java

@@ -0,0 +1,39 @@
+package com.jisco.dynamicweight.dynamicbasecamera.factories;
+
+import javax.servlet.AsyncContext;
+import java.io.IOException;
+
+public interface Converter {
+
+	/**
+	 * 获取该转换的key
+	 */
+	public String getKey();
+
+	/**
+	 * 获取该转换的url
+	 * 
+	 * @return
+	 */
+	public String getUrl();
+
+	/**
+	 * 添加一个流输出
+	 * 
+	 * @param entity
+	 */
+	public void addOutputStreamEntity(String key, AsyncContext entity) throws IOException;
+
+	/**
+	 * 退出转换
+	 */
+	public void exit();
+
+	/**
+	 * 启动
+	 */
+	public void start();
+
+
+
+}

+ 248 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/factories/ConverterFactories.java

@@ -0,0 +1,248 @@
+package com.jisco.dynamicweight.dynamicbasecamera.factories;
+
+import org.bytedeco.ffmpeg.avcodec.AVPacket;
+import org.bytedeco.ffmpeg.global.avcodec;
+import org.bytedeco.javacv.FFmpegFrameGrabber;
+import org.bytedeco.javacv.FFmpegFrameRecorder;
+import org.bytedeco.javacv.Frame;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.AsyncContext;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * javacv转包装<br/>
+ * 无须转码,更低的资源消耗,更低的延迟<br/>
+ * 确保流来源视频H264格式,音频AAC格式
+ * 
+ * @author hzj
+ */
+public class ConverterFactories extends Thread implements Converter {
+	private static Logger logger	= LoggerFactory.getLogger( ConverterFactories.class );
+
+	public volatile boolean runing = true;
+	/**
+	 * 读流器
+	 */
+	private FFmpegFrameGrabber grabber;
+	/**
+	 * 转码器
+	 */
+	private FFmpegFrameRecorder recorder;
+
+	/**
+	 * 转FLV格式的头信息<br/>
+	 * 如果有第二个客户端播放首先要返回头信息
+	 */
+	private byte[] headers;
+	/**
+	 * 保存转换好的流
+	 */
+	private ByteArrayOutputStream stream;
+	/**
+	 * 流地址,h264,aac
+	 */
+	private String url;
+	/**
+	 * 流输出
+	 */
+	private List<AsyncContext> outEntitys;
+
+	/**
+	 * key用于表示这个转换器
+	 */
+	private String key;
+
+	/**
+	 * 转换队列
+	 */
+	private Map<String, Converter> factories;
+
+	private String videoId;
+
+	public ConverterFactories(String url, String key, Map<String, Converter> factories, List<AsyncContext> outEntitys,String videoId) {
+		this.url = url;
+		this.key = key;
+		this.factories = factories;
+		this.outEntitys = outEntitys;
+		this.videoId = videoId;
+	}
+
+	@Override
+	public void run() {
+		boolean isCloseGrabberAndResponse = true;
+		try {
+			//抓取
+			grabber = new FFmpegFrameGrabber(url);
+			if ("rtsp".equals(url.substring(0, 4))) {
+				grabber.setOption("rtsp_transport", "tcp");
+				grabber.setOption("stimeout", "5000000");
+			}
+			grabber.start();
+			//end
+			if (avcodec.AV_CODEC_ID_H264 == grabber.getVideoCodec()
+					&& (grabber.getAudioChannels() == 0 || avcodec.AV_CODEC_ID_AAC == grabber.getAudioCodec())) {
+				logger.info("this url:{} converterFactories start", url);
+				// 来源视频H264格式,音频AAC格式
+				// 无须转码,更低的资源消耗,更低的延迟
+				stream = new ByteArrayOutputStream();
+				recorder = new FFmpegFrameRecorder(stream, grabber.getImageWidth(), grabber.getImageHeight(),
+						grabber.getAudioChannels());
+			 	recorder.setInterleaved(true);
+				recorder.setVideoOption("preset", "ultrafast");
+				recorder.setVideoOption("tune", "zerolatency");
+				recorder.setVideoOption("crf", "25");
+				recorder.setFrameRate(grabber.getFrameRate());
+				recorder.setSampleRate(grabber.getSampleRate());
+				if (grabber.getAudioChannels() > 0) {
+					recorder.setAudioChannels(grabber.getAudioChannels());
+					recorder.setAudioBitrate(grabber.getAudioBitrate());
+					recorder.setAudioCodec(grabber.getAudioCodec());
+				}
+				recorder.setFormat("flv");
+
+
+
+				recorder.setVideoBitrate(grabber.getVideoBitrate());
+			    recorder.setVideoCodec(grabber.getVideoCodec());
+				recorder.start(grabber.getFormatContext());//这个不报警告,但是不能加水印
+				//recorder.start();//这个能加水印,但是又警告
+				if (headers == null) {
+					headers = stream.toByteArray();
+					stream.reset();
+					writeResponse(headers);
+				}
+				while (runing) {
+				 	 AVPacket k = grabber.grabPacket();
+					if (k != null) {
+						try {
+							recorder.recordPacket(k);
+						} catch (Exception e) {
+						}
+						if (stream.size() > 0) {
+							byte[] b = stream.toByteArray();
+							stream.reset();
+							writeResponse(b);
+							if (outEntitys.isEmpty()) {
+								logger.info("没有输出退出");
+								break;
+							}
+						}
+						avcodec.av_packet_unref(k);
+					}
+					Thread.sleep(5);
+				}
+			} else {
+				////system.out.println("为什么会走到这?");
+				isCloseGrabberAndResponse = false;
+				// 需要转码为视频H264格式,音频AAC格式
+				ConverterTranFactories c = new ConverterTranFactories(url, key, factories, outEntitys,grabber,videoId);
+				factories.put(key, c);
+				c.start();
+			}
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+			logger.info("播放失败");
+
+		} finally {
+			closeConverter(isCloseGrabberAndResponse);
+			completeResponse(isCloseGrabberAndResponse);
+			logger.info("this url:{} converterFactories exit", url);
+
+		}
+	}
+
+	private boolean add = false;
+	/**
+	 * 输出FLV视频流
+	 * 
+	 * @param b
+	 */
+	public void writeResponse(byte[] b) {
+		Iterator<AsyncContext> it = outEntitys.iterator();
+		while (it.hasNext()) {
+			AsyncContext o = it.next();
+			try {
+				o.getResponse().getOutputStream().write(b);
+			} catch (Exception e) {
+				logger.info("移除一个输出");
+			 	o.complete();
+				it.remove();
+			}
+		}
+	}
+
+	/**
+	 * 退出转换
+	 */
+	public void closeConverter(boolean isCloseGrabberAndResponse) {
+		try{
+		 if (isCloseGrabberAndResponse) {
+			 grabber.close();
+			factories.remove(this.key);
+		 }
+			recorder.close();
+			stream.close();
+		}catch (Exception e){}
+	}
+
+	/**
+	 * 关闭异步响应
+	 * 
+	 * @param isCloseGrabberAndResponse
+	 */
+	public void completeResponse(boolean isCloseGrabberAndResponse) {
+		//system.out.println("isCloseGrabberAndResponse="+isCloseGrabberAndResponse);
+		if (isCloseGrabberAndResponse) {
+			Iterator<AsyncContext> it = outEntitys.iterator();
+			while (it.hasNext()) {
+				AsyncContext o = it.next();
+				//system.out.println("o="+o);
+				//o.getResponse().setContentType("application/json;charset=utf-8");
+				try{
+					o.getResponse().flushBuffer();
+				}catch (Exception e){}
+
+				o.complete();
+				it.remove();
+			}
+		}
+	}
+
+	@Override
+	public String getKey() {
+		return this.key;
+	}
+
+	@Override
+	public String getUrl() {
+		return this.url;
+	}
+
+	@Override
+	public void addOutputStreamEntity(String key, AsyncContext entity) throws IOException {
+		if (headers == null) {
+			outEntitys.add(entity);
+		} else {
+			entity.getResponse().getOutputStream().write(headers);
+			entity.getResponse().getOutputStream().flush();
+			outEntitys.add(entity);
+		}
+	}
+
+	@Override
+	public void exit() {
+		this.runing = false;
+		try {
+			this.join();
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+		}
+	}
+
+}

+ 221 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/factories/ConverterTranFactories.java

@@ -0,0 +1,221 @@
+package com.jisco.dynamicweight.dynamicbasecamera.factories;
+
+import org.bytedeco.ffmpeg.global.avcodec;
+import org.bytedeco.javacv.FFmpegFrameGrabber;
+import org.bytedeco.javacv.FFmpegFrameRecorder;
+import org.bytedeco.javacv.Frame;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.AsyncContext;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * javacv转码<br/>
+ * 流来源不是视频H264格式,音频AAC格式 转码为视频H264格式,音频AAC格式
+ * 
+ * @author hzj
+ */
+public class ConverterTranFactories extends Thread implements Converter {
+	private static Logger logger	= LoggerFactory.getLogger( ConverterTranFactories.class );
+
+	public volatile boolean runing = true;
+	/**
+	 * 读流器
+	 */
+	private FFmpegFrameGrabber grabber;
+	/**
+	 * 转码器
+	 */
+	private FFmpegFrameRecorder recorder;
+	/**
+	 * 转FLV格式的头信息<br/>
+	 * 如果有第二个客户端播放首先要返回头信息
+	 */
+	private byte[] headers;
+	/**
+	 * 保存转换好的流
+	 */
+	private ByteArrayOutputStream stream;
+	/**
+	 * 流地址,h264,aac
+	 */
+	private String url;
+	/**
+	 * 流输出
+	 */
+	private List<AsyncContext> outEntitys;
+
+	/**
+	 * key用于表示这个转换器
+	 */
+	private String key;
+
+	/**
+	 * 转换队列
+	 */
+	private Map<String, Converter> factories;
+
+	private String videoId;
+
+	public ConverterTranFactories(String url, String key, Map<String, Converter> factories,
+                                  List<AsyncContext> outEntitys, FFmpegFrameGrabber grabber,String videoId) {
+		this.url = url;
+		this.key = key;
+		this.factories = factories;
+		this.outEntitys = outEntitys;
+		this.grabber = grabber;
+		this.videoId = videoId;
+	}
+
+	@Override
+	public void run() {
+		try {
+			logger.info("this url:{} converterTranFactories start", url);
+			grabber.setFrameRate(25);
+			if (grabber.getImageWidth() > 1920) {
+				grabber.setImageWidth(1920);
+			}
+			if (grabber.getImageHeight() > 1080) {
+				grabber.setImageHeight(1080);
+			}
+			stream = new ByteArrayOutputStream();
+			recorder = new FFmpegFrameRecorder(stream, grabber.getImageWidth(), grabber.getImageHeight(),
+					grabber.getAudioChannels());
+			recorder.setInterleaved(true);
+			recorder.setVideoOption("preset", "ultrafast");
+			recorder.setVideoOption("tune", "zerolatency");
+			recorder.setVideoOption("crf", "25");
+			recorder.setGopSize(50);
+			recorder.setFrameRate(25);
+			recorder.setSampleRate(grabber.getSampleRate());
+			if (grabber.getAudioChannels() > 0) {
+				recorder.setAudioChannels(grabber.getAudioChannels());
+				recorder.setAudioBitrate(grabber.getAudioBitrate());
+				recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
+			}
+			recorder.setFormat("flv");
+			recorder.setVideoBitrate(grabber.getVideoBitrate());
+			recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
+			recorder.start();
+			if (headers == null) {
+				headers = stream.toByteArray();
+				stream.reset();
+				writeResponse(headers);
+			}
+			while (runing) {
+				// 抓取一帧
+				Frame f = grabber.grab();
+				if (f != null) {
+					try {
+						// 转码
+						recorder.record(f);
+					} catch (Exception e) {
+					}
+					if (stream.size() > 0) {
+						byte[] b = stream.toByteArray();
+						stream.reset();
+						writeResponse(b);
+						if (outEntitys.isEmpty()) {
+							logger.info("没有输出退出");
+							break;
+						}
+					}
+				}
+				Thread.sleep(5);
+			}
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+
+		} finally {
+			closeConverter();
+			completeResponse();
+			logger.info("this url:{} converterTranFactories exit", url);
+			factories.remove(this.key);
+		}
+	}
+
+	private boolean add = false;
+	/**
+	 * 输出FLV视频流
+	 * 
+	 * @param b
+	 */
+	public void writeResponse(byte[] b) {
+		Iterator<AsyncContext> it = outEntitys.iterator();
+		while (it.hasNext()) {
+			AsyncContext o = it.next();
+			try {
+				o.getResponse().getOutputStream().write(b);
+			} catch (Exception e) {
+				logger.info("移除一个输出",e);
+				o.complete();
+				it.remove();
+			}
+		}
+
+	}
+
+	/**
+	 * 退出转换
+	 */
+	public void closeConverter() {
+		try{
+			grabber.close();
+			recorder.close();
+			stream.close();
+			factories.remove(this.key);
+		}catch (Exception e){}
+
+	}
+
+	/**
+	 * 关闭异步响应
+	 */
+	public void completeResponse() {
+		Iterator<AsyncContext> it = outEntitys.iterator();
+		while (it.hasNext()) {
+			AsyncContext o = it.next();
+			o.complete();
+			it.remove();
+		}
+	}
+
+	@Override
+	public String getKey() {
+		return this.key;
+	}
+
+	@Override
+	public String getUrl() {
+		return this.url;
+	}
+
+	@Override
+	public void addOutputStreamEntity(String key, AsyncContext entity) throws IOException {
+		if (headers == null) {
+			outEntitys.add(entity);
+		} else {
+			entity.getResponse().getOutputStream().write(headers);
+			entity.getResponse().getOutputStream().flush();
+			outEntitys.add(entity);
+		}
+	}
+
+	@Override
+	public void exit() {
+		this.runing = false;
+		try {
+			this.join();
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+		}
+	}
+
+
+
+}

+ 256 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/factories/HLSConverterFactories.java

@@ -0,0 +1,256 @@
+package com.jisco.dynamicweight.dynamicbasecamera.factories;
+
+
+import org.bytedeco.ffmpeg.avcodec.AVPacket;
+import org.bytedeco.ffmpeg.avformat.AVFormatContext;
+import org.bytedeco.ffmpeg.global.avcodec;
+import org.bytedeco.ffmpeg.global.avutil;
+import org.bytedeco.javacv.FFmpegFrameGrabber;
+import org.bytedeco.javacv.FFmpegFrameRecorder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.AsyncContext;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import static org.bytedeco.ffmpeg.global.avcodec.av_packet_unref;
+
+/**
+ * javacv转包装<br/>
+ * 无须转码,更低的资源消耗,更低的延迟<br/>
+ * 确保流来源视频H264格式,音频AAC格式
+ * 
+ * @author hzj
+ */
+public class HLSConverterFactories extends Thread implements Converter {
+
+	private static Logger logger	= LoggerFactory.getLogger( HLSConverterFactories.class );
+
+	public volatile boolean runing = true;
+	/**
+	 * 读流器
+	 */
+	private FFmpegFrameGrabber grabber;
+	/**
+	 * 转码器
+	 */
+	private FFmpegFrameRecorder recorder;
+
+	/**
+	 * 转FLV格式的头信息<br/>
+	 * 如果有第二个客户端播放首先要返回头信息
+	 */
+	private byte[] headers;
+	/**
+	 * 保存转换好的流
+	 */
+	private ByteArrayOutputStream stream;
+	/**
+	 * 流地址,h264,aac
+	 */
+	private String url;
+	/**
+	 * 流输出
+	 */
+	private List<AsyncContext> outEntitys;
+
+	/**
+	 * key用于表示这个转换器
+	 */
+	private String key;
+
+	/**
+	 * 转换队列
+	 */
+	private Map<String, Converter> factories;
+
+	public HLSConverterFactories(String url, String key, Map<String, Converter> factories, List<AsyncContext> outEntitys) {
+		this.url = url;
+		this.key = key;
+		this.factories = factories;
+		this.outEntitys = outEntitys;
+	}
+
+	@Override
+	public void run() {
+		boolean isCloseGrabberAndResponse = true;
+		try {
+			//抓取
+			grabber = new FFmpegFrameGrabber(url);
+			if ("rtsp".equals(url.substring(0, 4))) {
+				grabber.setOption("rtsp_transport", "tcp");
+				grabber.setOption("stimeout", "5000000");
+			}
+			grabber.start();
+
+			int bitrate = 2500000;// 比特率
+			double framerate;// 帧率
+			int err_index = 0;// 推流过程中出现错误的次数
+			int timebase;// 时钟基
+			long dts = 0, pts = 0;// pkt的dts、pts时间戳
+			//end
+			// 开启ffmpeg日志级别;QUIET是屏蔽所有,可选INFO、DEBUG、ERROR等
+
+
+			// 异常的framerate,强制使用25帧
+			if (grabber.getFrameRate() > 0 && grabber.getFrameRate() < 100) {
+				framerate = grabber.getFrameRate();
+			} else {
+				framerate = 25.0;
+			}
+
+			bitrate = grabber.getVideoBitrate();// 获取到的比特率 0
+
+				stream = new ByteArrayOutputStream();
+				recorder = new FFmpegFrameRecorder(url, grabber.getImageWidth(), grabber.getImageHeight(),
+						grabber.getAudioChannels());
+
+				//system.out.println("11111");
+				// 设置比特率
+				recorder.setVideoBitrate(bitrate);
+				// h264编/解码器
+				recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
+				// 设置音频编码
+				recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);
+				// 视频帧率(保证视频质量的情况下最低25,低于25会出现闪屏)
+				recorder.setFrameRate(framerate);
+				// 关键帧间隔,一般与帧率相同或者是视频帧率的两倍
+				recorder.setGopSize((int) framerate);
+				// 解码器格式
+				recorder.setFormat("hls");
+				// 单个切片时长,单位是s,默认为2s
+				recorder.setOption("hls_time", "60");
+				// HLS播放的列表长度,0标识不做限制
+				recorder.setOption("hls_list_size", "0");
+				// 设置切片的ts文件序号起始值,默认从0开始,可以通过此项更改
+				recorder.setOption("start_number", "120");
+				/////
+			AVFormatContext fc = null;
+			fc = grabber.getFormatContext();
+			recorder.start(fc);
+			// 清空探测时留下的缓存
+//			grabber.flush();
+
+			AVPacket pkt = null;
+
+			for (int no_pkt_index = 0; no_pkt_index < 5 && err_index < 5;) {
+
+				pkt = grabber.grabPacket();
+				if (pkt == null || pkt.size() <= 0 || pkt.data() == null) {
+					Thread.sleep(1);
+					no_pkt_index++;
+					continue;
+				}
+				//system.out.println("----------------------");
+				// 获取到的pkt的dts,pts异常,将此包丢弃掉。
+				if (pkt.dts() == avutil.AV_NOPTS_VALUE && pkt.pts() == avutil.AV_NOPTS_VALUE || pkt.pts() < dts) {
+					err_index++;
+					av_packet_unref(pkt);
+					continue;
+				}
+				// 矫正dts,pts
+				pkt.pts(pts);
+				pkt.dts(dts);
+				err_index += (recorder.recordPacket(pkt) ? 0 : 1);
+				// pts,dts累加
+				timebase = grabber.getFormatContext().streams(pkt.stream_index()).time_base().den();
+
+				pts += (timebase / (int) framerate);
+				dts += (timebase / (int) framerate);
+			}
+
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+			logger.info("播放失败");
+			//可以在这里写个错误图片流返回,这样播放器就能看到问题了
+		} finally {
+			closeConverter(isCloseGrabberAndResponse);
+			completeResponse(isCloseGrabberAndResponse);
+			logger.info("this url:{} converterFactories exit", url);
+
+		}
+	}
+
+	/**
+	 * 输出FLV视频流
+	 * 
+	 * @param b
+	 */
+	public void writeResponse(byte[] b) {
+		Iterator<AsyncContext> it = outEntitys.iterator();
+		while (it.hasNext()) {
+			AsyncContext o = it.next();
+			try {
+				o.getResponse().getOutputStream().write(b);
+			} catch (Exception e) {
+				logger.info("移除一个输出");
+				it.remove();
+			}
+		}
+	}
+
+	/**
+	 * 退出转换
+	 */
+	public void closeConverter(boolean isCloseGrabberAndResponse) {
+		try{
+			grabber.close();
+			recorder.close();
+			stream.close();
+		}catch (Exception e){}
+
+	}
+
+	/**
+	 * 关闭异步响应
+	 * 
+	 * @param isCloseGrabberAndResponse
+	 */
+	public void completeResponse(boolean isCloseGrabberAndResponse) {
+		if (isCloseGrabberAndResponse) {
+			Iterator<AsyncContext> it = outEntitys.iterator();
+			while (it.hasNext()) {
+				AsyncContext o = it.next();
+				o.complete();
+			}
+		}
+	}
+
+	@Override
+	public String getKey() {
+		return this.key;
+	}
+
+	@Override
+	public String getUrl() {
+		return this.url;
+	}
+
+	@Override
+	public void addOutputStreamEntity(String key, AsyncContext entity) throws IOException {
+		if (headers == null) {
+			outEntitys.add(entity);
+		} else {
+			entity.getResponse().getOutputStream().write(headers);
+			entity.getResponse().getOutputStream().flush();
+			outEntitys.add(entity);
+		}
+	}
+
+	@Override
+	public void exit() {
+		this.runing = false;
+		try {
+			this.join();
+		} catch (Exception e) {
+			logger.error(e.getMessage(), e);
+		}
+	}
+
+
+
+}

+ 9 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/mapper/DynamicBaseCameraMapper.java

@@ -0,0 +1,9 @@
+package com.jisco.dynamicweight.dynamicbasecamera.mapper;
+
+import com.jisco.dynamicweight.dynamicbasecamera.model.DynamicBaseCamera;
+import com.steerinfo.framework.mapper.IBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DynamicBaseCameraMapper extends IBaseMapper<DynamicBaseCamera, String> {
+}

+ 625 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/mapper/DynamicBaseCameraMapper.xml

@@ -0,0 +1,625 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jisco.dynamicweight.dynamicbasecamera.mapper.DynamicBaseCameraMapper">
+  <resultMap id="BaseResultMap" type="com.jisco.dynamicweight.dynamicbasecamera.model.DynamicBaseCamera">
+    <id column="CAMERA_NO" jdbcType="VARCHAR" property="cameraNo" />
+    <result column="NAME" jdbcType="VARCHAR" property="name" />
+    <result column="MS_IP" jdbcType="VARCHAR" property="msIp" />
+    <result column="NVR_IP" jdbcType="VARCHAR" property="nvrIp" />
+    <result column="MS_PORT" jdbcType="DECIMAL" property="msPort" />
+    <result column="MS_CHANNEL" jdbcType="DECIMAL" property="msChannel" />
+    <result column="CAMERA_IP" jdbcType="VARCHAR" property="cameraIp" />
+    <result column="RSTP_PORT" jdbcType="DECIMAL" property="rstpPort" />
+    <result column="VEDIO_TYPE" jdbcType="DECIMAL" property="vedioType" />
+    <result column="CAMERA_CHANNEL" jdbcType="DECIMAL" property="cameraChannel" />
+    <result column="USERNAME" jdbcType="VARCHAR" property="username" />
+    <result column="PASSWORD" jdbcType="VARCHAR" property="password" />
+    <result column="MANUFACTURER" jdbcType="VARCHAR" property="manufacturer" />
+    <result column="MEMO" jdbcType="VARCHAR" property="memo" />
+    <result column="VALID_FLAG" jdbcType="VARCHAR" property="validFlag" />
+    <result column="CREATE_MAN_NO" jdbcType="VARCHAR" property="createManNo" />
+    <result column="CREATE_MAN_NAME" jdbcType="VARCHAR" property="createManName" />
+    <result column="CREATE_TIME" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="UPDATE_MAN_NO" jdbcType="VARCHAR" property="updateManNo" />
+    <result column="UPDATE_MAN_NAME" jdbcType="VARCHAR" property="updateManName" />
+    <result column="UPDATE_TIME" jdbcType="TIMESTAMP" property="updateTime" />
+  </resultMap>
+  <sql id="columns">
+    CAMERA_NO, NAME, MS_IP, NVR_IP, MS_PORT, MS_CHANNEL, CAMERA_IP, RSTP_PORT, VEDIO_TYPE, 
+    CAMERA_CHANNEL, USERNAME, PASSWORD, MANUFACTURER, MEMO, VALID_FLAG, CREATE_MAN_NO, 
+    CREATE_MAN_NAME, CREATE_TIME, UPDATE_MAN_NO, UPDATE_MAN_NAME, UPDATE_TIME
+  </sql>
+  <sql id="columns_alias">
+    t.CAMERA_NO, t.NAME, t.MS_IP, t.NVR_IP, t.MS_PORT, t.MS_CHANNEL, t.CAMERA_IP, t.RSTP_PORT, 
+    t.VEDIO_TYPE, t.CAMERA_CHANNEL, t.USERNAME, t.PASSWORD, t.MANUFACTURER, t.MEMO, t.VALID_FLAG, 
+    t.CREATE_MAN_NO, t.CREATE_MAN_NAME, t.CREATE_TIME, t.UPDATE_MAN_NO, t.UPDATE_MAN_NAME, 
+    t.UPDATE_TIME
+  </sql>
+  <sql id="select">
+    SELECT <include refid="columns"/> FROM DYNAMIC_BASE_CAMERA
+  </sql>
+  <sql id="select_alias">
+    SELECT <include refid="columns_alias"/> FROM DYNAMIC_BASE_CAMERA t
+  </sql>
+  <sql id="where">
+    <where> 
+      <if test="cameraNo != null and cameraNo != ''">
+        and CAMERA_NO = #{cameraNo}
+      </if>
+      <if test="name != null and name != ''">
+        and NAME = #{name}
+      </if>
+      <if test="msIp != null and msIp != ''">
+        and MS_IP = #{msIp}
+      </if>
+      <if test="nvrIp != null and nvrIp != ''">
+        and NVR_IP = #{nvrIp}
+      </if>
+      <if test="msPort != null">
+        and MS_PORT = #{msPort}
+      </if>
+      <if test="msChannel != null">
+        and MS_CHANNEL = #{msChannel}
+      </if>
+      <if test="cameraIp != null and cameraIp != ''">
+        and CAMERA_IP = #{cameraIp}
+      </if>
+      <if test="rstpPort != null">
+        and RSTP_PORT = #{rstpPort}
+      </if>
+      <if test="vedioType != null">
+        and VEDIO_TYPE = #{vedioType}
+      </if>
+      <if test="cameraChannel != null">
+        and CAMERA_CHANNEL = #{cameraChannel}
+      </if>
+      <if test="username != null and username != ''">
+        and USERNAME = #{username}
+      </if>
+      <if test="password != null and password != ''">
+        and PASSWORD = #{password}
+      </if>
+      <if test="manufacturer != null and manufacturer != ''">
+        and MANUFACTURER = #{manufacturer}
+      </if>
+      <if test="memo != null and memo != ''">
+        and MEMO = #{memo}
+      </if>
+      <if test="validFlag != null and validFlag != ''">
+        and VALID_FLAG = #{validFlag}
+      </if>
+      <if test="createManNo != null and createManNo != ''">
+        and CREATE_MAN_NO = #{createManNo}
+      </if>
+      <if test="createManName != null and createManName != ''">
+        and CREATE_MAN_NAME = #{createManName}
+      </if>
+      <if test="createTime != null">
+        and TO_CHAR(CREATE_TIME,'yyyy-MM-dd') = #{createTime}
+      </if>
+      <if test="updateManNo != null and updateManNo != ''">
+        and UPDATE_MAN_NO = #{updateManNo}
+      </if>
+      <if test="updateManName != null and updateManName != ''">
+        and UPDATE_MAN_NAME = #{updateManName}
+      </if>
+      <if test="updateTime != null">
+        and TO_CHAR(UPDATE_TIME,'yyyy-MM-dd') = #{updateTime}
+      </if>
+    </where>
+  </sql>
+  <sql id="whereLike">
+    <where> 
+      <if test="cameraNo != null and cameraNo != ''">
+        and CAMERA_NO LIKE '%${cameraNo}%'
+      </if>
+      <if test="name != null and name != ''">
+        and NAME LIKE '%${name}%'
+      </if>
+      <if test="msIp != null and msIp != ''">
+        and MS_IP LIKE '%${msIp}%'
+      </if>
+      <if test="nvrIp != null and nvrIp != ''">
+        and NVR_IP LIKE '%${nvrIp}%'
+      </if>
+      <if test="msPort != null">
+        and MS_PORT = #{msPort}
+      </if>
+      <if test="msChannel != null">
+        and MS_CHANNEL = #{msChannel}
+      </if>
+      <if test="cameraIp != null and cameraIp != ''">
+        and CAMERA_IP LIKE '%${cameraIp}%'
+      </if>
+      <if test="rstpPort != null">
+        and RSTP_PORT = #{rstpPort}
+      </if>
+      <if test="vedioType != null">
+        and VEDIO_TYPE = #{vedioType}
+      </if>
+      <if test="cameraChannel != null">
+        and CAMERA_CHANNEL = #{cameraChannel}
+      </if>
+      <if test="username != null and username != ''">
+        and USERNAME LIKE '%${username}%'
+      </if>
+      <if test="password != null and password != ''">
+        and PASSWORD LIKE '%${password}%'
+      </if>
+      <if test="manufacturer != null and manufacturer != ''">
+        and MANUFACTURER LIKE '%${manufacturer}%'
+      </if>
+      <if test="memo != null and memo != ''">
+        and MEMO LIKE '%${memo}%'
+      </if>
+      <if test="validFlag != null and validFlag != ''">
+        and VALID_FLAG LIKE '%${validFlag}%'
+      </if>
+      <if test="createManNo != null and createManNo != ''">
+        and CREATE_MAN_NO LIKE '%${createManNo}%'
+      </if>
+      <if test="createManName != null and createManName != ''">
+        and CREATE_MAN_NAME LIKE '%${createManName}%'
+      </if>
+      <if test="createTime != null">
+        and TO_CHAR(CREATE_TIME,'yyyy-MM-dd') = #{createTime}
+      </if>
+      <if test="updateManNo != null and updateManNo != ''">
+        and UPDATE_MAN_NO LIKE '%${updateManNo}%'
+      </if>
+      <if test="updateManName != null and updateManName != ''">
+        and UPDATE_MAN_NAME LIKE '%${updateManName}%'
+      </if>
+      <if test="updateTime != null">
+        and TO_CHAR(UPDATE_TIME,'yyyy-MM-dd') = #{updateTime}
+      </if>
+    </where>
+  </sql>
+  <delete id="deleteByPrimaryKey" parameterType="java.lang.String">
+    delete from DYNAMIC_BASE_CAMERA
+    where CAMERA_NO = #{cameraNo,jdbcType=VARCHAR}
+  </delete>
+  <delete id="deleteBySelectiveElement" parameterType="java.util.HashMap">
+    delete from DYNAMIC_BASE_CAMERA
+    where 1!=1 
+      <if test="name != null and name != ''">
+        or NAME = #{name}
+      </if>
+      <if test="msIp != null and msIp != ''">
+        or MS_IP = #{msIp}
+      </if>
+      <if test="nvrIp != null and nvrIp != ''">
+        or NVR_IP = #{nvrIp}
+      </if>
+      <if test="msPort != null">
+        or MS_PORT = #{msPort}
+      </if>
+      <if test="msChannel != null">
+        or MS_CHANNEL = #{msChannel}
+      </if>
+      <if test="cameraIp != null and cameraIp != ''">
+        or CAMERA_IP = #{cameraIp}
+      </if>
+      <if test="rstpPort != null">
+        or RSTP_PORT = #{rstpPort}
+      </if>
+      <if test="vedioType != null">
+        or VEDIO_TYPE = #{vedioType}
+      </if>
+      <if test="cameraChannel != null">
+        or CAMERA_CHANNEL = #{cameraChannel}
+      </if>
+      <if test="username != null and username != ''">
+        or USERNAME = #{username}
+      </if>
+      <if test="password != null and password != ''">
+        or PASSWORD = #{password}
+      </if>
+      <if test="manufacturer != null and manufacturer != ''">
+        or MANUFACTURER = #{manufacturer}
+      </if>
+      <if test="memo != null and memo != ''">
+        or MEMO = #{memo}
+      </if>
+      <if test="validFlag != null and validFlag != ''">
+        or VALID_FLAG = #{validFlag}
+      </if>
+      <if test="createManNo != null and createManNo != ''">
+        or CREATE_MAN_NO = #{createManNo}
+      </if>
+      <if test="createManName != null and createManName != ''">
+        or CREATE_MAN_NAME = #{createManName}
+      </if>
+      <if test="createTime != null">
+        or TO_CHAR(CREATE_TIME,'yyyy-MM-dd') = '#{createTime}'
+      </if>
+      <if test="updateManNo != null and updateManNo != ''">
+        or UPDATE_MAN_NO = #{updateManNo}
+      </if>
+      <if test="updateManName != null and updateManName != ''">
+        or UPDATE_MAN_NAME = #{updateManName}
+      </if>
+      <if test="updateTime != null">
+        or TO_CHAR(UPDATE_TIME,'yyyy-MM-dd') = '#{updateTime}'
+      </if>
+  </delete>
+  <insert id="insert" parameterType="com.jisco.dynamicweight.dynamicbasecamera.model.DynamicBaseCamera">
+    insert into DYNAMIC_BASE_CAMERA (CAMERA_NO, NAME, MS_IP, 
+      NVR_IP, MS_PORT, MS_CHANNEL, 
+      CAMERA_IP, RSTP_PORT, VEDIO_TYPE, 
+      CAMERA_CHANNEL, USERNAME, PASSWORD, 
+      MANUFACTURER, MEMO, VALID_FLAG, 
+      CREATE_MAN_NO, CREATE_MAN_NAME, CREATE_TIME, 
+      UPDATE_MAN_NO, UPDATE_MAN_NAME, UPDATE_TIME
+      )
+    values (#{cameraNo,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{msIp,jdbcType=VARCHAR}, 
+      #{nvrIp,jdbcType=VARCHAR}, #{msPort,jdbcType=DECIMAL}, #{msChannel,jdbcType=DECIMAL}, 
+      #{cameraIp,jdbcType=VARCHAR}, #{rstpPort,jdbcType=DECIMAL}, #{vedioType,jdbcType=DECIMAL}, 
+      #{cameraChannel,jdbcType=DECIMAL}, #{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, 
+      #{manufacturer,jdbcType=VARCHAR}, #{memo,jdbcType=VARCHAR}, #{validFlag,jdbcType=VARCHAR}, 
+      #{createManNo,jdbcType=VARCHAR}, #{createManName,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, 
+      #{updateManNo,jdbcType=VARCHAR}, #{updateManName,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}
+      )
+  </insert>
+  <insert id="insertSelective" parameterType="com.jisco.dynamicweight.dynamicbasecamera.model.DynamicBaseCamera">
+    insert into DYNAMIC_BASE_CAMERA
+    <trim prefix="(" suffix=")" suffixOverrides=",">
+      <if test="cameraNo != null">
+        CAMERA_NO,
+      </if>
+      <if test="name != null">
+        NAME,
+      </if>
+      <if test="msIp != null">
+        MS_IP,
+      </if>
+      <if test="nvrIp != null">
+        NVR_IP,
+      </if>
+      <if test="msPort != null">
+        MS_PORT,
+      </if>
+      <if test="msChannel != null">
+        MS_CHANNEL,
+      </if>
+      <if test="cameraIp != null">
+        CAMERA_IP,
+      </if>
+      <if test="rstpPort != null">
+        RSTP_PORT,
+      </if>
+      <if test="vedioType != null">
+        VEDIO_TYPE,
+      </if>
+      <if test="cameraChannel != null">
+        CAMERA_CHANNEL,
+      </if>
+      <if test="username != null">
+        USERNAME,
+      </if>
+      <if test="password != null">
+        PASSWORD,
+      </if>
+      <if test="manufacturer != null">
+        MANUFACTURER,
+      </if>
+      <if test="memo != null">
+        MEMO,
+      </if>
+      <if test="validFlag != null">
+        VALID_FLAG,
+      </if>
+      <if test="createManNo != null">
+        CREATE_MAN_NO,
+      </if>
+      <if test="createManName != null">
+        CREATE_MAN_NAME,
+      </if>
+      <if test="createTime != null">
+        CREATE_TIME,
+      </if>
+      <if test="updateManNo != null">
+        UPDATE_MAN_NO,
+      </if>
+      <if test="updateManName != null">
+        UPDATE_MAN_NAME,
+      </if>
+      <if test="updateTime != null">
+        UPDATE_TIME,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides=",">
+      <if test="cameraNo != null">
+        #{cameraNo,jdbcType=VARCHAR},
+      </if>
+      <if test="name != null">
+        #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="msIp != null">
+        #{msIp,jdbcType=VARCHAR},
+      </if>
+      <if test="nvrIp != null">
+        #{nvrIp,jdbcType=VARCHAR},
+      </if>
+      <if test="msPort != null">
+        #{msPort,jdbcType=DECIMAL},
+      </if>
+      <if test="msChannel != null">
+        #{msChannel,jdbcType=DECIMAL},
+      </if>
+      <if test="cameraIp != null">
+        #{cameraIp,jdbcType=VARCHAR},
+      </if>
+      <if test="rstpPort != null">
+        #{rstpPort,jdbcType=DECIMAL},
+      </if>
+      <if test="vedioType != null">
+        #{vedioType,jdbcType=DECIMAL},
+      </if>
+      <if test="cameraChannel != null">
+        #{cameraChannel,jdbcType=DECIMAL},
+      </if>
+      <if test="username != null">
+        #{username,jdbcType=VARCHAR},
+      </if>
+      <if test="password != null">
+        #{password,jdbcType=VARCHAR},
+      </if>
+      <if test="manufacturer != null">
+        #{manufacturer,jdbcType=VARCHAR},
+      </if>
+      <if test="memo != null">
+        #{memo,jdbcType=VARCHAR},
+      </if>
+      <if test="validFlag != null">
+        #{validFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="createManNo != null">
+        #{createManNo,jdbcType=VARCHAR},
+      </if>
+      <if test="createManName != null">
+        #{createManName,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateManNo != null">
+        #{updateManNo,jdbcType=VARCHAR},
+      </if>
+      <if test="updateManName != null">
+        #{updateManName,jdbcType=VARCHAR},
+      </if>
+      <if test="updateTime != null">
+        #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </trim>
+  </insert>
+  <update id="updateByPrimaryKey" parameterType="com.jisco.dynamicweight.dynamicbasecamera.model.DynamicBaseCamera">
+    update DYNAMIC_BASE_CAMERA
+    set NAME = #{name,jdbcType=VARCHAR},
+      MS_IP = #{msIp,jdbcType=VARCHAR},
+      NVR_IP = #{nvrIp,jdbcType=VARCHAR},
+      MS_PORT = #{msPort,jdbcType=DECIMAL},
+      MS_CHANNEL = #{msChannel,jdbcType=DECIMAL},
+      CAMERA_IP = #{cameraIp,jdbcType=VARCHAR},
+      RSTP_PORT = #{rstpPort,jdbcType=DECIMAL},
+      VEDIO_TYPE = #{vedioType,jdbcType=DECIMAL},
+      CAMERA_CHANNEL = #{cameraChannel,jdbcType=DECIMAL},
+      USERNAME = #{username,jdbcType=VARCHAR},
+      PASSWORD = #{password,jdbcType=VARCHAR},
+      MANUFACTURER = #{manufacturer,jdbcType=VARCHAR},
+      MEMO = #{memo,jdbcType=VARCHAR},
+      VALID_FLAG = #{validFlag,jdbcType=VARCHAR},
+      CREATE_MAN_NO = #{createManNo,jdbcType=VARCHAR},
+      CREATE_MAN_NAME = #{createManName,jdbcType=VARCHAR},
+      CREATE_TIME = #{createTime,jdbcType=TIMESTAMP},
+      UPDATE_MAN_NO = #{updateManNo,jdbcType=VARCHAR},
+      UPDATE_MAN_NAME = #{updateManName,jdbcType=VARCHAR},
+      UPDATE_TIME = #{updateTime,jdbcType=TIMESTAMP}
+    where CAMERA_NO = #{cameraNo,jdbcType=VARCHAR}
+  </update>
+  <update id="updateByPrimaryKeySelective" parameterType="com.jisco.dynamicweight.dynamicbasecamera.model.DynamicBaseCamera">
+    update DYNAMIC_BASE_CAMERA
+    <set>
+      <if test="name != null">
+        NAME = #{name,jdbcType=VARCHAR},
+      </if>
+      <if test="msIp != null">
+        MS_IP = #{msIp,jdbcType=VARCHAR},
+      </if>
+      <if test="nvrIp != null">
+        NVR_IP = #{nvrIp,jdbcType=VARCHAR},
+      </if>
+      <if test="msPort != null">
+        MS_PORT = #{msPort,jdbcType=DECIMAL},
+      </if>
+      <if test="msChannel != null">
+        MS_CHANNEL = #{msChannel,jdbcType=DECIMAL},
+      </if>
+      <if test="cameraIp != null">
+        CAMERA_IP = #{cameraIp,jdbcType=VARCHAR},
+      </if>
+      <if test="rstpPort != null">
+        RSTP_PORT = #{rstpPort,jdbcType=DECIMAL},
+      </if>
+      <if test="vedioType != null">
+        VEDIO_TYPE = #{vedioType,jdbcType=DECIMAL},
+      </if>
+      <if test="cameraChannel != null">
+        CAMERA_CHANNEL = #{cameraChannel,jdbcType=DECIMAL},
+      </if>
+      <if test="username != null">
+        USERNAME = #{username,jdbcType=VARCHAR},
+      </if>
+      <if test="password != null">
+        PASSWORD = #{password,jdbcType=VARCHAR},
+      </if>
+      <if test="manufacturer != null">
+        MANUFACTURER = #{manufacturer,jdbcType=VARCHAR},
+      </if>
+      <if test="memo != null">
+        MEMO = #{memo,jdbcType=VARCHAR},
+      </if>
+      <if test="validFlag != null">
+        VALID_FLAG = #{validFlag,jdbcType=VARCHAR},
+      </if>
+      <if test="createManNo != null">
+        CREATE_MAN_NO = #{createManNo,jdbcType=VARCHAR},
+      </if>
+      <if test="createManName != null">
+        CREATE_MAN_NAME = #{createManName,jdbcType=VARCHAR},
+      </if>
+      <if test="createTime != null">
+        CREATE_TIME = #{createTime,jdbcType=TIMESTAMP},
+      </if>
+      <if test="updateManNo != null">
+        UPDATE_MAN_NO = #{updateManNo,jdbcType=VARCHAR},
+      </if>
+      <if test="updateManName != null">
+        UPDATE_MAN_NAME = #{updateManName,jdbcType=VARCHAR},
+      </if>
+      <if test="updateTime != null">
+        UPDATE_TIME = #{updateTime,jdbcType=TIMESTAMP},
+      </if>
+    </set>
+    where CAMERA_NO = #{cameraNo,jdbcType=VARCHAR}
+  </update>
+  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
+    <include refid="select"/>
+    where CAMERA_NO = #{cameraNo,jdbcType=VARCHAR}
+  </select>
+  <select id="selectByParameters" parameterType="java.util.HashMap" resultMap="BaseResultMap">
+    <include refid="select"/>
+    <include refid="where"/>
+  </select>
+  <select id="selectLikeByParameters" parameterType="java.util.HashMap" resultMap="BaseResultMap">
+    <include refid="select"/>
+    <include refid="whereLike"/>
+  </select>
+  <insert id="batchInsert" parameterType="java.util.List">
+    insert into DYNAMIC_BASE_CAMERA 
+      (CAMERA_NO, 
+      NAME, MS_IP, NVR_IP, 
+      MS_PORT, MS_CHANNEL, CAMERA_IP, 
+      RSTP_PORT, VEDIO_TYPE, CAMERA_CHANNEL, 
+      USERNAME, PASSWORD, MANUFACTURER, 
+      MEMO, VALID_FLAG, CREATE_MAN_NO, 
+      CREATE_MAN_NAME, CREATE_TIME, 
+      UPDATE_MAN_NO, UPDATE_MAN_NAME, UPDATE_TIME
+      )
+    ( <foreach collection="list" item="item" separator="union all"> 
+   select  
+      #{item.cameraNo,jdbcType=VARCHAR}, 
+      #{item.name,jdbcType=VARCHAR}, #{item.msIp,jdbcType=VARCHAR}, #{item.nvrIp,jdbcType=VARCHAR}, 
+      #{item.msPort,jdbcType=DECIMAL}, #{item.msChannel,jdbcType=DECIMAL}, #{item.cameraIp,jdbcType=VARCHAR}, 
+      #{item.rstpPort,jdbcType=DECIMAL}, #{item.vedioType,jdbcType=DECIMAL}, #{item.cameraChannel,jdbcType=DECIMAL}, 
+      #{item.username,jdbcType=VARCHAR}, #{item.password,jdbcType=VARCHAR}, #{item.manufacturer,jdbcType=VARCHAR}, 
+      #{item.memo,jdbcType=VARCHAR}, #{item.validFlag,jdbcType=VARCHAR}, #{item.createManNo,jdbcType=VARCHAR}, 
+      #{item.createManName,jdbcType=VARCHAR}, #{item.createTime,jdbcType=TIMESTAMP}, 
+      #{item.updateManNo,jdbcType=VARCHAR}, #{item.updateManName,jdbcType=VARCHAR}, #{item.updateTime,jdbcType=TIMESTAMP}
+       from dual  
+   </foreach> )
+  </insert>
+  <update id="batchUpdate" parameterType="java.util.List">
+     update DYNAMIC_BASE_CAMERA
+     set
+       CAMERA_NO=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.cameraNo,jdbcType=VARCHAR}
+       </foreach>
+       ,NAME=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.name,jdbcType=VARCHAR}
+       </foreach>
+       ,MS_IP=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.msIp,jdbcType=VARCHAR}
+       </foreach>
+       ,NVR_IP=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.nvrIp,jdbcType=VARCHAR}
+       </foreach>
+       ,MS_PORT=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.msPort,jdbcType=DECIMAL}
+       </foreach>
+       ,MS_CHANNEL=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.msChannel,jdbcType=DECIMAL}
+       </foreach>
+       ,CAMERA_IP=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.cameraIp,jdbcType=VARCHAR}
+       </foreach>
+       ,RSTP_PORT=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.rstpPort,jdbcType=DECIMAL}
+       </foreach>
+       ,VEDIO_TYPE=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.vedioType,jdbcType=DECIMAL}
+       </foreach>
+       ,CAMERA_CHANNEL=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.cameraChannel,jdbcType=DECIMAL}
+       </foreach>
+       ,USERNAME=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.username,jdbcType=VARCHAR}
+       </foreach>
+       ,PASSWORD=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.password,jdbcType=VARCHAR}
+       </foreach>
+       ,MANUFACTURER=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.manufacturer,jdbcType=VARCHAR}
+       </foreach>
+       ,MEMO=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.memo,jdbcType=VARCHAR}
+       </foreach>
+       ,VALID_FLAG=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.validFlag,jdbcType=VARCHAR}
+       </foreach>
+       ,CREATE_MAN_NO=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.createManNo,jdbcType=VARCHAR}
+       </foreach>
+       ,CREATE_MAN_NAME=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.createManName,jdbcType=VARCHAR}
+       </foreach>
+       ,CREATE_TIME=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.createTime,jdbcType=TIMESTAMP}
+       </foreach>
+       ,UPDATE_MAN_NO=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.updateManNo,jdbcType=VARCHAR}
+       </foreach>
+       ,UPDATE_MAN_NAME=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.updateManName,jdbcType=VARCHAR}
+       </foreach>
+       ,UPDATE_TIME=
+       <foreach collection="list" item="item" index="index" separator=" " open="case CAMERA_NO" close="end">
+          when #{item.cameraNo,jdbcType=VARCHAR} then #{item.updateTime,jdbcType=TIMESTAMP}
+       </foreach>
+     where CAMERA_NO in 
+     <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
+    #{item.cameraNo,jdbcType=VARCHAR}
+     </foreach> 
+  </update>
+  <delete id="batchDelete" parameterType="java.util.List">
+    delete from DYNAMIC_BASE_CAMERA
+    where CAMERA_NO in 
+    <foreach collection="list" item="id" open="(" close=")" separator=",">
+      #{id}
+    </foreach>
+  </delete>
+  <!-- 友情提示!!!-->
+  <!-- 请将自己写的代码放在此标签之下,方便以后粘贴复制。-->
+  
+</mapper>

+ 349 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/model/DynamicBaseCamera.java

@@ -0,0 +1,349 @@
+package com.jisco.dynamicweight.dynamicbasecamera.model;
+
+import com.steerinfo.framework.model.IBasePO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@ApiModel(value="null")
+public class DynamicBaseCamera implements IBasePO<String> {
+    /**
+     * 摄像头编号(ID)(CAMERA_NO,VARCHAR,20)
+     */
+    @ApiModelProperty(value="摄像头编号(ID)",required=true)
+    private String cameraNo;
+
+    /**
+     * 名称(NAME,VARCHAR,50)
+     */
+    @ApiModelProperty(value="名称",required=true)
+    private String name;
+
+    /**
+     * 流媒体IP(MS_IP,VARCHAR,15)
+     */
+    @ApiModelProperty(value="流媒体IP",required=false)
+    private String msIp;
+
+    /**
+     * 硬盘录像机IP(NVR_IP,VARCHAR,15)
+     */
+    @ApiModelProperty(value="硬盘录像机IP",required=false)
+    private String nvrIp;
+
+    /**
+     * 流媒体端口号(MS_PORT,DECIMAL,38)
+     */
+    @ApiModelProperty(value="流媒体端口号",required=false)
+    private BigDecimal msPort;
+
+    /**
+     * 流媒体通道号(MS_CHANNEL,DECIMAL,38)
+     */
+    @ApiModelProperty(value="流媒体通道号",required=false)
+    private BigDecimal msChannel;
+
+    /**
+     * 摄像头IP(CAMERA_IP,VARCHAR,15)
+     */
+    @ApiModelProperty(value="摄像头IP",required=false)
+    private String cameraIp;
+
+    /**
+     * RSTP端口(RSTP_PORT,DECIMAL,0)
+     */
+    @ApiModelProperty(value="RSTP端口",required=true)
+    private Short rstpPort;
+
+    /**
+     * 码流类型(VEDIO_TYPE,DECIMAL,0)
+     */
+    @ApiModelProperty(value="码流类型",required=true)
+    private Short vedioType;
+
+    /**
+     * 摄像头通道号(CAMERA_CHANNEL,DECIMAL,0)
+     */
+    @ApiModelProperty(value="摄像头通道号",required=true)
+    private Short cameraChannel;
+
+    /**
+     * 用户名(USERNAME,VARCHAR,20)
+     */
+    @ApiModelProperty(value="用户名",required=true)
+    private String username;
+
+    /**
+     * 密码(PASSWORD,VARCHAR,20)
+     */
+    @ApiModelProperty(value="密码",required=true)
+    private String password;
+
+    /**
+     * 摄像头厂家(MANUFACTURER,VARCHAR,30)
+     */
+    @ApiModelProperty(value="摄像头厂家",required=true)
+    private String manufacturer;
+
+    /**
+     * 备注(MEMO,VARCHAR,200)
+     */
+    @ApiModelProperty(value="备注",required=false)
+    private String memo;
+
+    /**
+     * 状态(0:无效;1:有效)(VALID_FLAG,VARCHAR,1)
+     */
+    @ApiModelProperty(value="状态(0:无效;1:有效)",required=true)
+    private String validFlag;
+
+    /**
+     * 创建人编号(CREATE_MAN_NO,VARCHAR,20)
+     */
+    @ApiModelProperty(value="创建人编号",required=true)
+    private String createManNo;
+
+    /**
+     * 创建人姓名(CREATE_MAN_NAME,VARCHAR,30)
+     */
+    @ApiModelProperty(value="创建人姓名",required=true)
+    private String createManName;
+
+    /**
+     * 创建时间(YYYY-MM-DD HH:mm:SS)(CREATE_TIME,TIMESTAMP,7)
+     */
+    @ApiModelProperty(value="创建时间(YYYY-MM-DD HH:mm:SS)",required=true)
+    private Date createTime;
+
+    /**
+     * 修改人编号(UPDATE_MAN_NO,VARCHAR,20)
+     */
+    @ApiModelProperty(value="修改人编号",required=false)
+    private String updateManNo;
+
+    /**
+     * 修改人姓名(UPDATE_MAN_NAME,VARCHAR,30)
+     */
+    @ApiModelProperty(value="修改人姓名",required=false)
+    private String updateManName;
+
+    /**
+     * 修改时间(YYYY-MM-DD HH:mm:SS)(UPDATE_TIME,TIMESTAMP,7)
+     */
+    @ApiModelProperty(value="修改时间(YYYY-MM-DD HH:mm:SS)",required=false)
+    private Date updateTime;
+
+    private static final long serialVersionUID = 1L;
+
+    @Override
+    public String getId() {
+        return this.cameraNo;
+    }
+
+    @Override
+    public void setId(String cameraNo) {
+        this.cameraNo = cameraNo == null ? null : cameraNo.trim();
+    }
+
+    public String getCameraNo() {
+        return cameraNo;
+    }
+
+    public void setCameraNo(String cameraNo) {
+        this.cameraNo = cameraNo == null ? null : cameraNo.trim();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name == null ? null : name.trim();
+    }
+
+    public String getMsIp() {
+        return msIp;
+    }
+
+    public void setMsIp(String msIp) {
+        this.msIp = msIp == null ? null : msIp.trim();
+    }
+
+    public String getNvrIp() {
+        return nvrIp;
+    }
+
+    public void setNvrIp(String nvrIp) {
+        this.nvrIp = nvrIp == null ? null : nvrIp.trim();
+    }
+
+    public BigDecimal getMsPort() {
+        return msPort;
+    }
+
+    public void setMsPort(BigDecimal msPort) {
+        this.msPort = msPort;
+    }
+
+    public BigDecimal getMsChannel() {
+        return msChannel;
+    }
+
+    public void setMsChannel(BigDecimal msChannel) {
+        this.msChannel = msChannel;
+    }
+
+    public String getCameraIp() {
+        return cameraIp;
+    }
+
+    public void setCameraIp(String cameraIp) {
+        this.cameraIp = cameraIp == null ? null : cameraIp.trim();
+    }
+
+    public Short getRstpPort() {
+        return rstpPort;
+    }
+
+    public void setRstpPort(Short rstpPort) {
+        this.rstpPort = rstpPort;
+    }
+
+    public Short getVedioType() {
+        return vedioType;
+    }
+
+    public void setVedioType(Short vedioType) {
+        this.vedioType = vedioType;
+    }
+
+    public Short getCameraChannel() {
+        return cameraChannel;
+    }
+
+    public void setCameraChannel(Short cameraChannel) {
+        this.cameraChannel = cameraChannel;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username == null ? null : username.trim();
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password == null ? null : password.trim();
+    }
+
+    public String getManufacturer() {
+        return manufacturer;
+    }
+
+    public void setManufacturer(String manufacturer) {
+        this.manufacturer = manufacturer == null ? null : manufacturer.trim();
+    }
+
+    public String getMemo() {
+        return memo;
+    }
+
+    public void setMemo(String memo) {
+        this.memo = memo == null ? null : memo.trim();
+    }
+
+    public String getValidFlag() {
+        return validFlag;
+    }
+
+    public void setValidFlag(String validFlag) {
+        this.validFlag = validFlag == null ? null : validFlag.trim();
+    }
+
+    public String getCreateManNo() {
+        return createManNo;
+    }
+
+    public void setCreateManNo(String createManNo) {
+        this.createManNo = createManNo == null ? null : createManNo.trim();
+    }
+
+    public String getCreateManName() {
+        return createManName;
+    }
+
+    public void setCreateManName(String createManName) {
+        this.createManName = createManName == null ? null : createManName.trim();
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateManNo() {
+        return updateManNo;
+    }
+
+    public void setUpdateManNo(String updateManNo) {
+        this.updateManNo = updateManNo == null ? null : updateManNo.trim();
+    }
+
+    public String getUpdateManName() {
+        return updateManName;
+    }
+
+    public void setUpdateManName(String updateManName) {
+        this.updateManName = updateManName == null ? null : updateManName.trim();
+    }
+
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(getClass().getSimpleName());
+        sb.append(" [");
+        sb.append("Hash = ").append(hashCode());
+        sb.append(", cameraNo=").append(cameraNo);
+        sb.append(", name=").append(name);
+        sb.append(", msIp=").append(msIp);
+        sb.append(", nvrIp=").append(nvrIp);
+        sb.append(", msPort=").append(msPort);
+        sb.append(", msChannel=").append(msChannel);
+        sb.append(", cameraIp=").append(cameraIp);
+        sb.append(", rstpPort=").append(rstpPort);
+        sb.append(", vedioType=").append(vedioType);
+        sb.append(", cameraChannel=").append(cameraChannel);
+        sb.append(", username=").append(username);
+        sb.append(", password=").append(password);
+        sb.append(", manufacturer=").append(manufacturer);
+        sb.append(", memo=").append(memo);
+        sb.append(", validFlag=").append(validFlag);
+        sb.append(", createManNo=").append(createManNo);
+        sb.append(", createManName=").append(createManName);
+        sb.append(", createTime=").append(createTime);
+        sb.append(", updateManNo=").append(updateManNo);
+        sb.append(", updateManName=").append(updateManName);
+        sb.append(", updateTime=").append(updateTime);
+        sb.append(", serialVersionUID=").append(serialVersionUID);
+        sb.append("]");
+        return sb.toString();
+    }
+}

+ 21 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/service/IDynamicBaseCameraService.java

@@ -0,0 +1,21 @@
+package com.jisco.dynamicweight.dynamicbasecamera.service;
+
+import com.jisco.dynamicweight.dynamicbasecamera.model.DynamicBaseCamera;
+import com.steerinfo.framework.service.IBaseService;
+
+/**
+ * DynamicBaseCamera服务接口:
+ * @author generator
+ * @version 1.0-SNAPSHORT 2022-02-15 09:14
+ * 类描述
+ * 修订历史:
+ * 日期:2022-02-15
+ * 作者:generator
+ * 参考:
+ * 描述:DynamicBaseCamera服务接口
+ * @see null
+ * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
+ */
+public interface IDynamicBaseCameraService extends IBaseService<DynamicBaseCamera, String>{
+
+}

+ 16 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/service/IFLVService.java

@@ -0,0 +1,16 @@
+package com.jisco.dynamicweight.dynamicbasecamera.service;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public interface IFLVService {
+
+	/**
+	 * 打开一个流地址
+	 * 
+	 * @param url
+	 * @param response
+	 */
+	public void open(String url, String videoId, HttpServletResponse response, HttpServletRequest request);
+
+}

+ 34 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/service/impl/DynamicBaseCameraServiceImpl.java

@@ -0,0 +1,34 @@
+package com.jisco.dynamicweight.dynamicbasecamera.service.impl;
+
+import com.jisco.dynamicweight.dynamicbasecamera.mapper.DynamicBaseCameraMapper;
+import com.jisco.dynamicweight.dynamicbasecamera.model.DynamicBaseCamera;
+import com.jisco.dynamicweight.dynamicbasecamera.service.IDynamicBaseCameraService;
+import com.steerinfo.framework.mapper.IBaseMapper;
+import com.steerinfo.framework.service.impl.BaseServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * DynamicBaseCamera服务实现:
+ * @author generator
+ * @version 1.0-SNAPSHORT 2022-02-15 09:14
+ * 类描述
+ * 修订历史:
+ * 日期:2022-02-15
+ * 作者:generator
+ * 参考:
+ * 描述:DynamicBaseCamera服务实现
+ * @see null
+ * @Copyright 湖南视拓信息技术股份有限公司. All rights reserved.
+ */
+@Service(value = "dynamicBaseCameraService")
+public class DynamicBaseCameraServiceImpl extends BaseServiceImpl<DynamicBaseCamera, String> implements IDynamicBaseCameraService {
+
+    @Autowired
+    private DynamicBaseCameraMapper dynamicBaseCameraMapper;
+
+    @Override
+    protected IBaseMapper<DynamicBaseCamera, String> getMapper() {
+        return dynamicBaseCameraMapper;
+    }
+}

+ 95 - 0
src/main/java/com/jisco/dynamicweight/dynamicbasecamera/service/impl/FLVService.java

@@ -0,0 +1,95 @@
+package com.jisco.dynamicweight.dynamicbasecamera.service.impl;
+
+import com.jisco.dynamicweight.dynamicbasecamera.factories.Converter;
+import com.jisco.dynamicweight.dynamicbasecamera.factories.ConverterFactories;
+import com.jisco.dynamicweight.dynamicbasecamera.service.IFLVService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import javax.servlet.AsyncContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * FLV流转换
+ * 
+ * @author hzj
+ */
+
+@Service(value = "flvService")
+public class FLVService implements IFLVService {
+	private static Logger logger	= LoggerFactory.getLogger( FLVService.class );
+	private Map<String, Converter> converters = new HashMap<String, Converter>();
+
+	@Override
+	public void open(String url,String videoId, HttpServletResponse response, HttpServletRequest request) {
+		String key = md5(url);
+
+		AsyncContext async = request.startAsync();
+		async.setTimeout(0);
+		if (converters.containsKey(key) && url.indexOf("/tracks")==-1) {
+			Converter c = converters.get(key);
+			try {
+				c.addOutputStreamEntity(key, async);
+			} catch (IOException e) {
+				logger.error(e.getMessage(), e);
+				throw new IllegalArgumentException(e.getMessage());
+			}
+		} else {
+		   Converter converter = converters.get(key);
+			if(converter!=null){
+				converter.exit();
+			}
+			List<AsyncContext> outs = new ArrayList<AsyncContext>();
+			outs.add(async);
+			ConverterFactories c = new ConverterFactories(url, key, converters, outs,videoId);
+			c.start();
+			converters.put(key, c);
+		}
+
+		response.setContentType("video/x-flv");
+		response.setHeader("Connection", "keep-alive");
+
+		try {
+			//response.getWriter().write("{\"code\":200}");
+			response.setStatus(HttpServletResponse.SC_OK);
+			response.flushBuffer();
+		} catch (IOException e) {
+			logger.error(e.getMessage(), e);
+		}
+	}
+
+	public String md5(String plainText) {
+		StringBuilder buf = null;
+		try {
+			MessageDigest md = MessageDigest.getInstance("MD5");
+			md.update(plainText.getBytes());
+			byte b[] = md.digest();
+			int i;
+			buf = new StringBuilder("");
+			for (int offset = 0; offset < b.length; offset++) {
+				i = b[offset];
+				if (i < 0)
+				{
+					i += 256;
+				}
+				if (i < 16)
+				{
+					buf.append("0");
+				}
+				buf.append(Integer.toHexString(i));
+			}
+		} catch (NoSuchAlgorithmException e) {
+			logger.error(e.getMessage(), e);
+		}
+		return buf.toString();
+	}
+
+}

+ 9 - 0
src/main/java/com/steerinfo/meterwork/meterworkstorageactual/service/impl/MeterWorkStorageActualServiceImpl.java

@@ -30,11 +30,20 @@ import com.steerinfo.meterwork.meterworkstorageactual.model.MeterWorkStorageActu
 import com.steerinfo.meterwork.meterworkstorageactual.service.IMeterWorkStorageActualService;
 import com.steerinfo.meterwork.meterworkstoragesinglewgt.mapper.MeterWorkStorageSingleWgtMapper;
 import com.steerinfo.meterwork.meterworkstoragesinglewgt.model.MeterWorkStorageSingleWgt;
+import com.steerinfo.meterwork.meterworkstoragesinglewgt.service.IMeterWorkStorageSingleWgtService;
 import com.steerinfo.pretrack.prestoragescale.mapper.PreStorageScaleMapper;
 import com.steerinfo.pretrack.prestoragescale.model.PreStorageScale;
+import com.steerinfo.pretrack.pretrackscale.model.PreTrackScale;
 import com.steerinfo.util.*;
+import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
+import org.apache.http.util.EntityUtils;
+import org.apache.ibatis.jdbc.Null;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 

+ 1 - 0
src/main/java/com/steerinfo/util/TestClient2.java

@@ -3,6 +3,7 @@ package com.steerinfo.util;
 import com.steerinfo.framework.utils.collection.ListUtils;
 import com.steerinfo.meterwork.constants.DbConstants;
 import com.steerinfo.rtdb.*;
+import com.sun.org.apache.bcel.internal.generic.NEW;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;