Springboot接入海康摄像头

阅读: 评论:0

Springboot接入海康摄像头

Springboot接入海康摄像头

具体实现参考:

  1. 前端是无法直接播放rstp推流来的视频,所以需要用ffmpeg进行转码。

  1. ffmpeg只能推送TCP或者HTTP协议还不支持ws协议。

  1. 后端的实现暂时只试了ws模式,http没有试过

大致流程图。

-i "rtsp地址" -q 0 -f mpegts -codec:v mpeg1video -s 800x600 推送地址

需要注意的点:

的陷阱

参考:

=distribute.-task-blog-2~default~baidujs_baidulandingword~default-0-103815379-blog-125668719.pc_relevant_3mothn_strategy_and_data_recovery&spm=1001.2101.3001.4242.1&utm_relevant_index=3

解决方案:

a.定义StreamGobbler类来多开线程处理ErrorStream()的信息 ,只要循环输出即可

public class StreamGobbler extends Thread {InputStream is;String type;String videoUrl;public StreamGobbler(InputStream is, String type,String videoUrl) {this.is = pe = type;this.videoUrl = videoUrl;}@Overridepublic void run() {try {InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String line = null;while ((line = br.readLine()) != null) {if (type.equals("Error")) {System.out.println(line);} else {
//                    System.out.println("Debug:" + line);}}//防止windows进程意外关闭versionVideo.destroy(videoUrl);} catch (IOException ioe) {ioe.printStackTrace();}}
}

b.在调用ffmpeg时使用

/*** 转换视频流*/
@Component
@Slf4j
public class ConversionVideo{public ConcurrentHashMap<String, Process> processMap = new ConcurrentHashMap<>();public void destroy(String videoUrl){Process process = (videoUrl);if (process !=null){process.destroy();ve(videoUrl);log.info("------------------------推流结束-------------------------");}}public Integer pushVideoAsRTSP(String videoUrl, String controllerUrl){Process process = (videoUrl);// 已经在推送了不需要进行操作if(process != null){return 0;}// 获取ffmpeg位置String ffmpegPath = Property("ffmpeg");try {// cmd命令拼接,注意命令中存在空格String command = ffmpegPath;// ffmpeg开头,-re代表按照帧率发送,在推流时必须有// 指定要推送的视频command += " -i "" + videoUrl + """;// 指定推送服务器,-f:指定格式command += " -q 0 -f mpegts -codec:v mpeg1video -s 800x600 " + controllerUrl;log.info("ffmpeg推流命令:" + command);// 运行cmd命令,获取其进程process = Runtime().exec(command);//这里处理process的信息StreamGobbler errorGobbler = new ErrorStream(), "Error",videoUrl);errorGobbler.start();log.info("开始推流");processMap.put(videoUrl,process);}catch (Exception e){e.printStackTrace();}return 1;}}

2023-04-25

在对接IPCamera 摄像头的时候:

ffmpeg 报错 MPEG-1/2 does not support 15/1 fps

在命令行加上 -r 30 参数即可

原本命令:

 ffmpeg -i “rtsp://admin:foa123456@192.168.1.135:554/h264/ch1/main/av_stream” -q 0 -f mpegts -codec:v mpeg1video -s 1366x768 127.0.0.1:8081/123456

改为:

ffmpeg -i "rtsp://admin:foa123456@192.168.1.135:554/h264/ch1/main/av_stream" -r 30 -q 0 -f mpegts -codec:v mpeg1video -s 1366x768 127.0.0.1:8081/foa123456

参考地址:/

20230607 项目切换播放库mpegts(因为要使用video标签做3D视频融合)

前端播放库:

mpegts 和 jsmpeg

自行网上下载文件或者npm下载

mpegts (要求视频流是flv格式)

ffmpeg -i  "视频地址" -q 0 -f flv -vcodec h264 -an -s 1674x942 127.0.0.1:8081/foa123456
      var video = ElementById('video'+sxtIndex);var url = this.app.wsUrl +'/live/' + DataByObjectFields(sxtData, "unit","");var player = atePlayer({type: 'flv',isLive: true,url});player.attachMediaElement(video);player.load();player.play();

jsmpeg (vue项目需要将jsmpeg.min.js 文件开头的var JSMpeg换成 window.JSMpeg)

      // let canvas = ElementById('video')let url = 'ws://127.0.0.1:8866/live?porthole=' + this.portholelet player = new JSMpeg.Player(url, {canvas: this.$refs.video})

项目初始化ffmpeg

    @PostConstructpublic void loadFFmpeg() {log.info("正在初始化资源,请稍等...");String path = Property("user.dir");path = path + "\ffmpeg\bin\ ";System.setProperty("ffmpeg",path);log.Property("ffmpeg"));log.info("初始化成功");}

2023-07-24 记录

发现使用websocket有一些新问题,比如第二个ws连接和第一个连接使用同一个视频时,第二个连接前端不会播放

使用postman测试

发现第一次请求的时候会返回一个头部video信息,postman看不到具体数据内容,在网页端查看

经过查阅资料,这是flv视频固定开头,使用播放库的时候需要保证第一个发送的信息是这个(不知道是不是所有播放库都需要,待查证,有知道的大神麻烦讲一下)

这个头部信息似乎是固定的(因为我这边要播放的视频流是经过统一转码).因此把这一段的信息直接copy下来,在建立ws连接后发送即可(取中间的16进制数据)

本文发布于:2024-01-28 01:03:49,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17063750483721.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:摄像头   Springboot
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23