草庐IT

SkeyeVSS综合安防监控录像回放控制之自定义可拖动时间轴组件

OpenSKEYE 2023-06-02 原文

SkeyeVSS综合安防视频云服务通过接入SkeyeRMS录像服务器实现对系统里的摄像机等设备录像,通过自定义的时间轴组件对录像记录进行加载渲染,播放器回调时间与下面时间轴相互联动,集拖动、点击、缩放、无限加载等于一体的时间轴组件。

通过接口获取录像回放记录的列表,数据结构中包含每段录像的开始与结束时间,把每段记录绘制到时间轴上,左右拖动会自动触发日期的改变回调,再通过接口去获取对应日期的数据,方便我们整体查看,点击有录像的时间段区域或拖动指针(三角形)返回当前时间戳,再配合拉流进行播放,通过滚轮缩放最小精确到秒,最终效果如图所示:

时间轴组件基本功能 时间轴初始化代码及录像时间段的数据格式,如下:

<div class="timeline-group" id="timeline"></div>

let times = [
  {
    begin: new Date(new Date('2022-04-14 11:30:00')).getTime(),
    end: new Date(new Date('2022-04-14 17:00:00')).getTime()
  },
  {
    begin: new Date(new Date('2022-04-14 17:01:00')).getTime(),
    end: new Date(new Date('2022-04-14 19:00:00')).getTime()
  }
]

let TimeAxis = new TimeLine({
  dom: document.getElementById('timeline'),
  bg: '#000',
  date: new Date(new Date('2022-04-14').toLocaleDateString()).getTime(),
  cellStyle: {
    background: 'rgba(24,208,217,0.5)'
  },
  timecell: [...times],
  callback: (data) => {
    // {mode: 触发方式 timestamp: 时间戳 valid: 是否有效}
    console.log(data)
    this.$emit('changeTime', data)
  }
})
1、时间轴组件是使用canvas技术绘制,组件的宽高是自动根据外层div的宽高来自适应,通过设置外层div的宽高来控制即可。
  • 创建canvas
  • 注册事件
  • 初始化边框
  • 渲染时间轴
  • 初始化刻度线
  • 渲染播放指针
  • 有效时间区域填充时间段

this.canvas.addEventListener('contextmenu', (e) => {
    e.preventDefault();
});
this.canvas.addEventListener('mousemove', this.canvasMousemoveFunc.bind(this));
  // 滚轮事件
this.canvas.addEventListener('mousewheel', this.mousewheelFunc.bind(this));
this.canvas.addEventListener('mousedown', this.mousedownFunc.bind(this));
this.canvas.addEventListener('mouseup', this.mouseupFunc.bind(this));
this.canvas.addEventListener('mouseout', this.mouseoutFunc.bind(this));

this.canvas.addEventListener('click', this.clickFunc.bind(this));

2、设置时间段默认填充色, 背景填充色, 时间段还可设置不同的填充色,来区分不同的时间段,在数据结构中添加 style字段参数即可,如果在数据结构中添加了style字段,则优先使用style,没有style参数时再使用cellStyle参数,如果cellStyle参数不存在,则使用内置的默认填充色,如下图:
let times = [
  {
    begin: new Date(new Date('2022-04-14 11:30:00')).getTime(),
    end: new Date(new Date('2022-04-14 17:00:00')).getTime(),
	style: {
    	background: 'rgba(172,17,189,0.5)'
	}
  }
]	


cellStyle: {
  background: 'rgba(24,208,217,0.5)'
},
bg: '#000',

3、左右拖动,拖动时间轴时组件会自动监听日期的变化,实现无限加载每天的录像回放记录,将记录的时间段渲染到时间轴上,滚轮缩放 ,通过绑定滚轮事件来控制时间轴的放大与缩小,

this.canvas.addEventListener('mousewheel', this.mousewheelFunc.bind(this));

mousewheelFunc(event) {
    if (event && event.preventDefault) {
      event.preventDefault()
    } else {
      window.event.returnValue = false;
      return false;
    }
    let e = window.event || event;
    let delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
    let posX = this.getCursorPositionX(e);
    let middle_time = this.date + posX * (this.zoomHours * 3600 * 1000) / (this.canvasWidth); //ms 记住当前中间的时间
    if (delta < 0) {
      this.zoomHours = this.zoomHours - delta;
      if (this.zoomHours >= 24) {
        this.zoomHours = 24;//放大最大24小时
      }
    } else if (delta > 0) {// 放大
      this.zoomHours = this.zoomHours - delta;
      if (this.zoomHours <= 1) {
        this.zoomHours = 1;//缩小最小1小时
      }
    }
    this.clearCanvas();
    this.date = middle_time - posX * (this.zoomHours * 3600 * 1000) / (this.canvasWidth);
    this.initCanvasCtx()
}
4、配合SkeyeWebPlayer网页播放器,实现回放,在播放器callbackFunc回调中获取到当前播放的时间,通过TimeAxis.updateTime(时间戳)方法更新时间轴上面的播放指针位置,达到联动效果。
5、时间轴上单击右键 和 拖动指针结束后都会返回当前位置 获取当前点击位置 计算出时间戳,通过callback返回,拿到时间可生成播放地址或拉取播放信息,传到播放器中播放,在返回的参数中已经判断好当前时间是否为有效时间。mode判断是点击或拖动,valid判断时间是否在有效区域 如图:

获取更多信息

邮件:support@openskeye.cn

QQ交流群:102644504

SkeyeVSS综合安防互联网无插件播放解决方案

SkeyeARS全景AR增强监视系统解决方案

SkeyeIVMS集群式视频云管控平台解决方案

有关SkeyeVSS综合安防监控录像回放控制之自定义可拖动时间轴组件的更多相关文章

  1. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  2. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  3. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  4. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  5. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  6. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  7. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  8. ruby-on-rails - 在 heroku 的 .fonts 文件夹中包含自定义字体,似乎无法识别它们 - 2

    Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在

  9. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

  10. ruby-on-rails - 事件管理员和自定义方法 - 2

    这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什

随机推荐