Jinuss's blog Jinuss's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

前端可视化
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 框架

  • core模块

  • dom模块

  • control

  • geometry

  • geo

  • layer

    • marker

      • Marker
      • Marker.Drag
      • Icon
      • Icon.Default
      • DivIcon
    • tile

    • vector

    • Layer
    • LayerGroup
    • FeatureGroup
    • DivOverlay
    • Popup
    • Tooltip
    • ImageOverlay
    • SVGOverlay
    • VideoOverlay
      • 概述
      • 源码分析
        • 源码实现
        • 源码详解
        • 1. 继承与核心差异
        • 2. 核心方法
        • 关键特性与使用约束
        • 浏览器兼容性注意事项
      • 总结
    • GeoJSON
  • Map

  • 《Leaflet源码》笔记
  • layer
东流
2025-04-15
目录

VideoOverlay

# 概述

Leaflet中的VideoOverlay是ImageOverlay的扩展类, 用于在地图指定地理范围内叠加HTML5视频(如MP4,WebM).

# 源码分析

# 源码实现

VideoOverlay的源码实现如下:

export var VideoOverlay = ImageOverlay.extend({
  options: {
    autoplay: true, // 视频加载后自动播放
    loop: true, //视频循环播放
    keepAspectRatio: true, // 保持视频宽高比,通过`object-fit:contain`实现
    muted: true, // 初始静音
    playsInline: true, // 在移动端内联播放(避免全屏)
  },
  _initImage: function () {
    // 1.创建或复用现有`<video>`元素
    var wasElementSupplied = this._url.tagName === "VIDEO";
    var vid = (this._image = wasElementSupplied
      ? this._url
      : document.createElement("video"));
    
    // 2.添加 CSS 类
    DomUtil.addClass(vid, "leaflet-image-layer");
    if (this._zoomAnimated) {
      DomUtil.addClass(vid, "leaflet-zoom-animated");
    }
    // 3.禁用默认行为
    if (this.options.className) {
      DomUtil.addClass(vid, this.options.className);
    }

    vid.onselectstart = Util.falseFn;
    vid.onmousemove = Util.falseFn;
    // 4.绑定加载完成事件
    vid.onloadeddata = Util.bind(this.fire, this, "load");
  
    // 5.处理直接传入<video>元素的情况
    if (wasElementSupplied) {
      var sourceElements = vid.getElementsByTagName("source");
      // 提取所有<source>中的URL
      var sources = [];
      for (var j = 0; j < sourceElements.length; j++) {
        sources.push(sourceElements[j].src);
      }

      this._url = sourceElements.length > 0 ? sources : [vid.src];
      return;
    }

    if (!Util.isArray(this._url)) {
      this._url = [this._url];
    }
    
    // 6.配置视频属性
    if (
      !this.options.keepAspectRatio &&
      Object.prototype.hasOwnProperty.call(vid.style, "objectFit")
    ) {
      vid.style["objectFit"] = "fill"; // 拉伸填充
    }
    vid.autoplay = !!this.options.autoplay;
    vid.loop = !!this.options.loop;
    vid.muted = !!this.options.muted;
    vid.playsInline = !!this.options.playsInline;

    // 7.添加多个视频源兼容不同格式
    for (var i = 0; i < this._url.length; i++) {
      var source = DomUtil.create("source");
      source.src = this._url[i];
      vid.appendChild(source);
    }
  },
});

export function videoOverlay(video, bounds, options) {
	return new VideoOverlay(video, bounds, options);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

# 源码详解

# 1. 继承与核心差异

  • 继承自ImageOverlay:复用地理范围控制,透明度,事件处理等基础功能
  • 关键差异:
    • 使用<video>标签替代<img>或<svg>
    • 支持多视频源\播放控制\宽高比适配等视频特性

# 2. 核心方法

    1. 重写_initImage
    • 多源支持:接受视频URL数组,生成多个<source>标签以提高浏览器兼容性
    • 直接复用<video>元素:允许开发者预创建并配置视频元素

# 关键特性与使用约束

1.地理范围与视频适配

  • 自动调整尺寸:视频会根据地图缩放动态调整位置和大小

2.播放控制

  • 直接操作DOM:通过getElement()获取<video>元素,调用 HTML5 Video API

3.事件监听

  • 支持HTML5视频事件:如play,pause和ended等

# 浏览器兼容性注意事项

  • 自动播放策略:多数现代浏览器要求muted:true才能自动播放
  • 格式支持:提供多个视频源(如MP4+WebM)以确保跨浏览器兼容
  • 移动端限制:playsInline:true避免ios默认全屏播放

# 总结

VideoOverlay是Leaflet中处理地理参考视频叠加的核心类,适用于监控摄像头\动态数据可视化等场景,其实现关键点包括:

  • 复用ImageOverlay的地理映射逻辑,确保视频与地图同步
  • 深度整合HTML5 Video API,提供完整的播放控制
  • 多源与格式兼容,适应不同浏览器环境
  • 性能优化,通过 CSS属性(如object-fit)平衡视觉效果与渲染效率
编辑 (opens new window)
上次更新: 2025/05/06, 09:11:25
SVGOverlay
GeoJSON

← SVGOverlay GeoJSON→

最近更新
01
GeoJSON
05-08
02
Circle
04-15
03
CircleMarker
04-15
更多文章>
Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式