联博开奖:树莓派视频监控平台实现录制归档

admin/2020-07-11/ 分类:科技/阅读:

上一次用树莓派搭建了视频监控平台,乐成实现了行使树莓派当监控摄像头,然则只能在线监控没有存档功效,这次针对上次的监控平台举行了革新,实现了录制归档功效。

这次主要针对上次的平台做以下几点革新:

  1. 新增视频流录制模块
  2. 调整监控治理页面
  3. 新增录制归档列表页面

1. 开发视频流录制模块

视频录制模块不像视频推流模块那样,可以一直不住手的事情(推流),由于录制模块需要思量录制视频的巨细和断流等因素,以是在需要的时刻需要录制流程举行处置。

针对断流的情形,视频录制模块使用一个监控线程,当跨越两分钟未录制视频帧时,住手当前录制,录制器通过挪用ping方法来实现心跳:

public void run() { while (true) { try { TimeUnit.MINUTES.sleep(2); } catch (InterruptedException ignore) { } if (System.currentTimeMillis() - timestamp > 2 * 60 * 1000) { destroy(); } } } public void ping() { timestamp = System.currentTimeMillis(); } 

当视频连续录制是,需要限制视频的巨细,这里视频最长只录制一小时,当录制时长跨越一小时后,归档重新录制。

if (System.currentTimeMillis() - startTime > MAX_RECORD_TIME) { destroy(); } if (recorder == null) { init(frame.imageWidth, frame.imageHeight); } 

这里的录制模块是单例,以是当工具建立的时刻,就建立监听线程并启动它,以下是完成的实现:

public class StreamRecorder { public static final StreamRecorder INSTANCE = new StreamRecorder(); private static final int FPS = 25; private static final int MAX_RECORD_TIME = 60 * 60 * 1000; private long startTime; private FFmpegFrameRecorder recorder; private AtomicBoolean wait = new AtomicBoolean(false); private StreamRecorder() { new Thread(this.new ALiveWatcher()).start(); } public void record(Frame frame) { if (wait.get() || frame == null) { return; } if (System.currentTimeMillis() - startTime > MAX_RECORD_TIME) { destroy(); } if (recorder == null) { init(frame.imageWidth, frame.imageHeight); } long timestamp = 1000 * (System.currentTimeMillis() - startTime); if (timestamp > recorder.getTimestamp()) { recorder.setTimestamp(timestamp); } try { recorder.record(frame); } catch (Exception e) { destroy(); } } private void init(int width, int height) { try { startTime = System.currentTimeMillis(); String f = Const.RECORD_DIR File.separator startTime ".flv"; recorder = new FFmpegFrameRecorder(f, width, height); recorder.setFormat("flv"); recorder.setFrameRate(FPS); recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P); recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); recorder.start(); } catch (Throwable e) { throw new RuntimeException(e); } } public void destroy() { if (recorder == null) { return; } try { wait.set(true); TimeUnit.SECONDS.sleep(1); recorder.close(); recorder = null; } catch (Throwable ignore) { } finally { wait.set(false); } } class ALiveWatcher implements Runnable { private long timestamp; @Override public void run() { while (true) { try { TimeUnit.MINUTES.sleep(2); } catch (InterruptedException ignore) { } if (System.currentTimeMillis() - timestamp > 2 * 60 * 1000) { destroy(); } } } public void ping() { timestamp = System.currentTimeMillis(); } } } 

2. 革新监控治理页面

这里直接革新上次的监控治理页面,将结构调整为左右模式,并新增了“开启录制”和“住手录制”按钮、以及“录制归档列表”的入口跳转,整体页面效果如下:

需要注重的是:要实现录制,必须开启监控,只有开启了监控才可以录制。

3. 开发录制控制接口

跟上次开发监控控制接口一样,在IndexController中新增两个接口用于控制“开启录制”和“住手录制”。

public void startRecord() { StreamManager.INSTANCE.startRecord(); redirect("/"); } public void stopRecord() { StreamManager.INSTANCE.stopRecord(); redirect("/"); } 

上面的StreamManager是视频流管控中央,在这里往推流器注册一个视频帧消费者,然后将视频帧塞给录制器实现录制。

private void registerFrameConsumer() { if (sender == null) { return; } sender.registerFrameConsumer(f -> { if (record) { StreamRecorder.INSTANCE.record(f); } }); } 

以是当开启录制时,只需要将record置为true即可。

public void startRecord() { record = true; } 

而住手录制时则将record置为false,同时关闭录制。

public void stopRecord() { record = false; StreamRecorder.INSTANCE.destroy(); } 

4. 播放录制视频

视频录制后会以最先录制时间戳为名称存放在录制目录中(程序设置的是:/home/pi/RevVideo),录制的视频格式是FLV,接纳JavaCV录制FLV无法直接使用HTML5的video播放,要播放录制的视频,可以用树莓派自带的媒体播放工具VLC, 下面视频VLC播放已录制的视频画面:

至此,视频监控平台就实现了录制归档功效。

5. 开发视频归档列表页面

为了利便查看树莓派中录制的视频列表,可以开发一个简朴的页面用于显示已经录制的视频,实现这个功效只需要简朴的两步即可。

  1. 视频列表显示页面开发
<body> <a href="/"> 查看视频监控 >>> </a> <br> <br> <div> <table border="1"> <tr> <td>视频名称</td> <td>视频巨细</td> <td>录制时间</td> </tr> #for(v : fList) <tr> <td>#(v.name)</td> <td>#(v.size)</td> <td>#(v.time)</td> </tr> #end </table> </div> </body> 
  1. 归档视频列表接口开发
public void index() { List<VideoVO> fList = new ArrayList<>(20); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); File dir = new File(Const.RECORD_DIR); File[] fArray = dir.listFiles(f -> f.getName().endsWith(".flv")); if (fArray != null) { for (File f : fArray) { VideoVO vo = new VideoVO(); vo.setName(f.getName()); vo.setSize(f.length()); vo.setTime(sdf.format(new Date(Long.parseLong(f.getName().replace(".flv", ""))))); fList.add(vo); } } setAttr("fList", fList); render("index.html"); } 

最终效果如下:

6. 拓展玩法

虽然这个视频监控平台已经实现了监控和录制功效,但仍有部门缺陷,如果有兴趣可以举行拓展。
好比:

  1. 录制视频使用ffmpeg举行转码,然后使用HTML5-video标签举行播放回看。
  2. 录制视频提供删除和定期清算功效。
  3. 录制视频提供下载功效。

=========================================================
项目源码可关注民众号 “HiIT青年” 发送 “raspi-record” 获取。


关注民众号,阅读更多文章。

由于上次揭晓的文章,被人盗用公布在头条上,这里我在文章的图片加了LOGO水印,未便之处请多原谅。

,

环球UG

欢迎进入环球UG官网(UG环球):www.ugbet.us,环球UG官方网站:www.ugbet.net开放环球UG网址访问、环球UG会员注册、环球UG代理申请、环球UG电脑客户端、环球UG手机版下载等业务。

TAG:
阅读:
广告 330*360
广告 330*360
Sunbet_进入申博sunbet官网
微信二维码扫一扫
关注微信公众号
新闻自媒体 Copyright © 2002-2019 Sunbet 版权所有
二维码
意见反馈 二维码