使用 HTML5 和 JavaScript 从视频中捕获帧

2023-11-21

我想每 5 秒从视频中捕获一帧。

这是我的 JavaScript 代码:

video.addEventListener('loadeddata', function() {
    var duration = video.duration;
    var i = 0;

    var interval = setInterval(function() {
        video.currentTime = i;
        generateThumbnail(i);
        i = i+5;
        if (i > duration) clearInterval(interval);
    }, 300);
});

function generateThumbnail(i) {     
    //generate thumbnail URL data
    var context = thecanvas.getContext('2d');
    context.drawImage(video, 0, 0, 220, 150);
    var dataURL = thecanvas.toDataURL();

    //create img
    var img = document.createElement('img');
    img.setAttribute('src', dataURL);

    //append img in container div
    document.getElementById('thumbnailContainer').appendChild(img);
}

我遇到的问题是生成的第一两个图像是相同的,并且未生成持续时间为 5 秒的图像。我发现缩略图是在特定时间的视频帧显示之前生成的< video> tag.

例如,当video.currentTime = 5,生成第0帧的图像。然后视频帧跳转到时间5s。所以当video.currentTime = 10,生成第5s帧的图像。


Cause

问题是寻找视频(通过设置它currentTime) 是异步的。

你需要听seeked事件,否则它将冒着采用实际当前帧的风险,这可能是您的旧值。

因为它是异步的,所以你必须not使用setInterval()因为它也是异步的,当寻找下一帧时您将无法正确同步。没有必要使用setInterval()因为我们将利用seeked相反,事件将使一切保持同步。

Solution

通过稍微重写代码,您可以使用seeked事件来浏览视频以捕获正确的帧,因为此事件通过设置来确保我们实际上处于我们请求的帧currentTime财产。

Example

// global or parent scope of handlers
var video = document.getElementById("video"); // added for clarity: this is needed
var i = 0;

video.addEventListener('loadeddata', function() {
    this.currentTime = i;
});

将此事件处理程序添加到聚会中:

video.addEventListener('seeked', function() {

  // now video has seeked and current frames will show
  // at the time as we expect
  generateThumbnail(i);

  // when frame is captured, increase here by 5 seconds
  i += 5;

  // if we are not past end, seek to next interval
  if (i <= this.duration) {
    // this will trigger another seeked event
    this.currentTime = i;
  }
  else {
    // Done!, next action
  }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 HTML5 和 JavaScript 从视频中捕获帧 的相关文章

随机推荐

  • R 中多项式的拟合值:参考类别的系数?

    我使用 nnet 包中的函数 multinom 来运行多项逻辑回归 In multinomial logistic regression as I understand it the coefficients are the changes
  • 直接访问实例变量时使用 self->ivar

    我注意到大多数 Objective C 程序员从不使用self gt ivar直接访问实例变量时的语法 我看到的大多数示例代码只是引用实例变量而没有self gt 我认为引用实例变量而不明确它是实例变量而不仅仅是当前范围的变量是相当令人困惑
  • graphviz:如果输出是 SVG,则不会插入 SVG 图像的节点

    我创建了一个小的 SVG 图像 它在 Firefox 中渲染得很好 然后我创建了一个 graphviz 文件包含 除其他外 mynote label image mybox svg 然后我运行了这个 dot Tsvg svg core in
  • Chrome 的 --auto-open-devtools-for-tabs

    我正在尝试使用命令行开关从快捷方式启动 chrome 时自动打开开发工具 auto open devtools for tabs 即该快捷方式的路径是 C Program Files x86 Google Chrome Applicatio
  • 填充可变数量的

    用未知 在编译时 数量填充变量的最佳方法是什么 例如 假设 int n 5 int b fillwithones 5 现在 b 包含 11111 二进制 我不能只是硬编码 int b 31 因为 n 提前不知道 在我的应用程序中 我可以做这
  • 我自己的存储和检索使用 Delphi 文本 DFM 格式的寿命很长

    随着时间的推移 我已经推出了自己的格式来保存和加载对象属性 但在必须重新访问时 我想知道是否使用 Delphi 自己的文本 DFM 格式 我知道这确实是一种 内部 格式 但它的读者现在似乎定义得很好 并且它可以处理所有类型的属性 有人对可能
  • 在 git-svn 项目中使用 git 子模块

    在我们的 git svn 管理的项目中 我们有 3 个上游项目 它们都保存在 GitHub 上的本机 git 存储库中 由于这些上游项目的源代码在我们的控制之下并且经常更改 因此我们当前的解决方案 即每次更改某些内容时都将构建工件重新部署到
  • 如何使用JS和传单层控件更改基础层

    我必须修改现有的应用程序 其中使用传单图层控件 我需要在启动地图时显示基础图层之一 有没有办法 如何从 JS 脚本调用层控件中的某些函数 比如 control select 1 如果没有 如何以与控件相同的方式添加图块图层 当我在地图初始化
  • Three.js - 鱼眼效果

    所以 我搞砸了three js 效果很好 我唯一不明白的是如何制作具有真正鱼眼效果的相机 这怎么可能 camera setLens 鱼眼效果可以使用 Giliam de Carpentier 的镜头畸变着色器来实现 着色器代码 functi
  • 如何使用Excel VBA制作外部日志?

    代码已更新以引用以下更改 该日志系统为 Excel 创建一个名为 Log txt 的外部文档 它将在 log txt 文件中创建一行 如下所示 11 27 20 AM Matthew Ridge 将单元格 N 55 从 ss 更改为 这不会
  • JDK8 无法与 JDK8(WS 客户端)一起使用

    我有一个非常简单的 现有的 Web 服务 我想使用 JDK8 生成一个 Web 服务客户端 我使用的是纯 JDK8 工具链 这意味着我使用 JDK8 目录中的 wsimport 工具 现在问题来了 JDK8 中的 wsimport 工具生成
  • Angular2 异常没有字符串提供者

    我有一个使用 ng cli 创建的全新应用程序 用这个非常简单的代码 import Component from angular core Component selector app root templateUrl app compon
  • 替换字符串中字符的所有实例的最快方法[重复]

    这个问题在这里已经有答案了 在 JavaScript 中替换字符串中字符串 字符的所有实例的最快方法是什么 Awhile a for loop 正则表达式 最简单的方法是使用正则表达式g替换所有实例的标志 str replace foo g
  • 连接管理器 unregisterNetworkCallBack 已取消注册

    在我的 Android 应用程序中 我正在取消注册活动的网络回调 onPause 有时我会遇到错误 原因是 java lang IllegalArgumentException NetworkCallback was already unr
  • Django 中的 URL 路径参数与查询参数

    我已经环顾了一段时间 似乎找不到任何涉及差异的东西 正如标题所述 我试图找出通过 url 路径参数获取数据的区别 例如 content 7然后在 urls py 中使用正则表达式 并从查询参数中获取它们 例如 content num 7 u
  • ASP.NET -- IIS7 -- IBM DB2 问题

    我正在开发一个调用 DB2 数据库的 ASP NET 网站 我在将托管该站点的 Windows 2008 服务器上安装了 Visual Studio 当我使用集成 Web 服务器在 Visual Studio 中调试站点时 我可以连接到数据
  • 将 NSAttributedString 添加到 UIBarButtonItem

    我正在尝试在后栏按钮项目上设置属性字符串 这是我第一次尝试属性字符串 这是代码 self navigationItem hidesBackButton true let barButtonBackStr lt Back var attrib
  • 用作索引器键的打字稿文字类型

    有没有什么方法可以定义可以用作索引器中的字符串键的打字稿文字类型 type TColorKey dark light interface ColorMap period TColorKey Color 这会引发错误 An index sig
  • 在执行shell中获取Jenkins环境变量

    我想知道是否可以在配置构建中的执行 shell 内访问 Jenkins 环境变量 如果是这样 你能给我举个例子吗 我需要将环境信息与测试的一些输出结合起来 以提供完整的运行报告 不使用插件 Please check http yourjen
  • 使用 HTML5 和 JavaScript 从视频中捕获帧

    我想每 5 秒从视频中捕获一帧 这是我的 JavaScript 代码 video addEventListener loadeddata function var duration video duration var i 0 var in