快照视频作为预览

2023-12-12

我在从视频中获取快照用作标题图像时遇到问题。下面有我当前使用的代码,但我得到的输出只是一个黑色图像。在控制台中我没有遇到任何问题。我将视频上传到我使用的文件服务器后执行此操作。

    let video = $(videoPath).find('#newVideo').get(0);
    let canvas = document.createElement('canvas');
    video.onloadedmetadata = function() {
        video.play();
        canvas.width = 640;
        canvas.height = 480;
        var ctx = canvas.getContext('2d');
        ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
        var dataURI = canvas.toDataURL('image/jpeg');
        let $previewBox = $(".post-preview-box");
        let $previewCardImg = $previewBox.find(".card-img");

我用过如何对基于 HTML5-JavaScript 的视频播放器进行快照?作为获取快照的基础,然后添加一些其他东西,希望它能起作用,但到目前为止我还无法做到。

欢迎任何有关尝试的帮助或意见。

编辑 04-03-2020(四月三号):为了提供更多说明,我将在 dataURI 之外添加一个控制台并对我所做的代码进行更改。

数据:图像/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQ EBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/waARCACWASwDAREAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0K xwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdisUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NX W19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAweBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVynLRChYkNOEl8RCYGRomJyg pKJU2Nzg5OkNERUZHSELKU1RVVLDYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHimKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+P n6/9oADAMBAAIRAxEAPwD8qqACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加奥阿卡克加阿卡克加奥AKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACg AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAK ACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgA oAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAC gAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgD//2Q==

添加了视频的currentTime并将其设置为3(我也尝试过使用5)。

    let video = $(videoPath).find('#newVideo').get(0);
    let canvas = document.createElement('canvas');
    video.onloadedmetadata = function() {
        video.currentTime = 3;
        video.play();
        var ctx = canvas.getContext('2d');
        ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
        var dataURI = canvas.toDataURL('image/jpeg');
        let $previewBox = $(".post-preview-box");
        console.log(dataURI);
        let $previewCardImg = $previewBox.find(".card-img");

在没有看到所有代码的情况下,这里是一个获得 10 个屏幕的示例。

var screens = [];

var video = document.getElementById('video');
var video_preview = document.getElementById('video_preview');

var loadingContainer = document.getElementById('loading-container')

function loadVideo(event) {
  loadingContainer.style.display = 'block'
  screens = [];

  var reader = new FileReader()
  reader.onload = function(e) {
    video.src = video_preview.src = e.target.result;
    video.autoplay = video_preview.autoplay = true;
    video.hasLoaded = video_preview.hasLoaded = false;

    video_preview.addEventListener('canplay', function() {
      video_preview.hasLoaded = true;
      video.play();
    })

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

      // first time
      if (!video.hasLoaded) {
        console.log('Loaded: video duration: ', this.duration, event.target.files[0].size)

        loadingContainer.innerText = 'Generating screens...'

        video.hasLoaded = true;

        var self = this;

        (function repeat(i) {
          setTimeout(function() {
            var timestamp = ((self.duration / 10) * i) / 1.1; // fudge abit so dont get start/end frames

            console.log('seeking to:', timestamp)
            self.currentTime = timestamp

            if (--i) {
              // next
              repeat(i);
            } else {
              //
              loadingContainer.style.display = 'none'

              // all screens grabbed
              var str = '<div style="position:relative;width:calc(100% + .25rem)">'
              screens.reverse().forEach(function(screen) {
                str += '<img src="' + screen + '" style="width:32%" class="img-thumbnail m-1" />';
              });
              str += '</div>';
              document.getElementById("screens-container").innerHTML = str;
            }
          }, 500) // how fast to attempt to grab screens
        })(11); // iterations i.e how many screens
      }
    }, false);

    video.addEventListener('seeked', function() {
      console.log('grabbing screen for', this.currentTime)
      takeScreen();
    }, false);
  }

  reader.readAsDataURL(event.target.files[0]);
}

function takeScreen() {
  var filename = video.src;
  var w = video.videoWidth;
  var h = video.videoHeight;
  var canvas = document.createElement('canvas');
  canvas.width = w;
  canvas.height = h;
  var ctx = canvas.getContext('2d');
  ctx.drawImage(video, 0, 0, w, h);
  var data = canvas.toDataURL("image/jpg");

  screens.push(data)

  loadingContainer.innerText = 'Generated ' + screens.length + ' out of 10 screens...'
}

function failed(e) {
  switch (e.target.error.code) {
    case e.target.error.MEDIA_ERR_ABORTED:
      console.log('You aborted the video playback.');
      break;
    case e.target.error.MEDIA_ERR_NETWORK:
      console.log('A network error caused the video download to fail part-way.');
      break;
    case e.target.error.MEDIA_ERR_DECODE:
      console.log('The video playback was aborted due to a corruption problem or because the video used features your browser did not support.');
      break;
    case e.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED:
      console.log('The video could not be loaded, either because the server or network failed or because the format is not supported.');
      break;
    default:
      console.log('An unknown error occurred.');
      break;
  }
}
body,
html {
  margin: 0;
  padding: 0
}

li {
  display: inline-block;
  list-style-type: none
}

.jumbotron {
  margin-bottom: 1rem;
}
<div class="container">

  <div class="card">
    <div class="card-header" style="background-color: #e9ecef">
      <h5 class="card-title">Video Preview</h5>
      <video id="video_preview" onerror="failed(event)" controls="controls" preload="none" muted style="width: 100%"></video>
      <video id="video" onerror="failed(event)" controls="controls" preload="none" muted style="display:none"></video>
      <div class="card-body">
        <a href="javascript:void(0)" class="btn btn-sm btn-primary btn-block" onClick="$('[type=\'file\']').trigger('click')">
          <i class="fa fa-upload"></i> Load Video
        </a>
        <form id="uploadForm" ref="uploadForm" action='/upload' method='post' enctype="multipart/form-data">
          <input type="file" name="file" accept="video/*" style="display: none" onchange="loadVideo(event)">
        </form>
        <div id="loading-container" style="display:none">Loading...</div>
      </div>

      <div class="card-body">
        <h5 class="card-title">Screens</h5>
        <div id="screens-container"></div>
      </div>
    </div>
  </div>

  <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

  <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

有关更完整的示例,请参阅:https://codesandbox.io/s/clipseed-hfhee

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快照视频作为预览 的相关文章

  • javascript获取网页中选定文本的段落

    突出显示文本后 我想获取所选文本所在的段落 var select window content document getSelection 请问有什么指点吗 这实际上很难做到 因为你必须考虑六种情况 所选内容不在一个段落内 简单 整个选择都
  • Vue 多个组件位于一个包/文件中

    假设我想创建一个 UI 包 如何将多个组件放入一个 JS 文件中 通常我会将不同的组件放在不同的文件中 import ButtonText from ButtonText vue import ButtonIcon from ButtonI
  • 什么是 jQuery valHook?

    阅读完有关valHooks in a jQuery 缺陷 http bugs jquery com ticket 9319最近在一个fiddle http jsfiddle net bV5fu 1 我搜索了 jQuery 文档和 Googl
  • 适用于 HTML5 混合应用程序的 CORS

    我读过很多关于 CORS 的文章 以及允许 Access Control Allow Origin 如何成为 Web 服务器的安全漏洞 但没有一篇文章解释了如何允许 HTML5 混合应用程序访问某些不允许使用通配符 的域上托管的 Web 服
  • 有什么简单的方法可以清理 Google Maps v3 API 上的所有标记、折线和其他叠加层吗?

    我想获得一张新地图 而不是使用刷新网页 thanks 并有简单的方法来获取地图上的所有叠加层 在 v2 API 中 有clearOverlays http code google com apis maps documentation ja
  • javascript 代码只能在函数之外工作 - 为什么?

    为什么这段代码不能像下面写的那样工作 但如果我注释掉function testBgChange 并将代码保留在该函数内 它可以正常工作 如果我将代码保留在函数中然后调用该函数 会有什么区别
  • 谷歌地图API v3如何获取所有形状的坐标

    我有这个谷歌脚本 可以创建形状和删除形状 但没有太多关于保存形状的信息 我查了一下互联网 知道我可以通过 overlaycomplete 中的 getpaths 访问路径坐标 而且我还可以将坐标推入一个收集所有形状的数组中 但是 如果用户删
  • 为什么 "asdf".replace(/.*/g, "x") == "xx" ?

    我偶然发现了一个令人惊讶的 对我来说 事实 console log asdf replace g x Why two替代品 似乎任何没有换行符的非空字符串都会产生此模式的两个替换 使用替换函数 我可以看到第一个替换是整个字符串 第二个替换是
  • Node.js 连接 createServer 代码

    我正在阅读 Node js Connect 版本 2 15 0 Create a new connect server return Function api public function createServer function ap
  • 变量值的 swap() 函数[重复]

    这个问题在这里已经有答案了 我无法达到下面这个交换函数的预期结果 我希望将值打印为 3 2 function swap x y var t x x y y t console log swap 2 3 任何线索将不胜感激 您的函数正在内部交
  • 带有子节点的拖放区域

    我有一个带有多个子节点的拖放区域 主要元素有dropenter and dropleave事件 但是 如果您将文件拖动到主元素内部和子节点上方 则dropleave被触发 如何处理 以便dropleave仅当拖动的元素和鼠标位于主元素之外时
  • iOS 11 getUserMedia 不起作用?

    苹果公司发表声明称getUserMedia将在 iOS 11 上完全正常运行 安装 iOS 11 Beta 版本 5 后 我确实收到一条消息 表明我的网站请求访问我的相机和麦克风 但似乎是这样的 video src window URL c
  • 路由和干净路径(无主题标签)在 angularJS 中不起作用

    伙计们 这让我发疯了 我为此奋斗了几个小时 却找不到解决方案 我知道为了从 URL 路径中清除主题标签 我需要使用 locationProvider html5Mode true 但由于某种原因 这对我来说效果不佳 我使用 tomcat 7
  • 如何在 jQuery 中选择时对 DOM 元素进行排序?

    我的页面上有以下 DIV div Div 3 div div Div 2 div div Div 1 div div Div 6 div div Div 5 div div Div 4 div 我正在尝试使用 jQuery 代码选择 Div
  • jQuery可排序发布数据,但没有数据

    谁能告诉我我在这里缺少什么 我的数据似乎总是空的 我做错了什么 document ready function nav sortable connectWith nav axis y update function event ui var
  • Angular Material 10 范围 datepicker 和 moment.js 错误:date.getFullYear 不是函数

    尝试使用 moment js 的 rangePicker 选项来实现 Angular Material v10 datepicker 但是当我将 moment 与 rangePicker 结合使用时 它给了我这个错误 Error date
  • 如何检查 id 名称是否包含某种模式?

    我正在使用 jquery 并且循环如下 span each function index var idname this attr id idname click function window location href http thi
  • 查看元素的所有 dom 事件

    我有一个 jQuery UI 日期选择器 当您单击日期时 它会清除我的 URL 哈希值 并且不会更改文本框中的日期 我假设某个地方还有其他一些 JavaScript 实用程序 它也正在调用某种委托事件 抛出错误并终止 jquery 处理程序
  • 如何在jsp页面中包含javascript

    我是 J2EE 和 Web 开发的新手 这是我的问题 我想在网页中包含 angular js 这是有效的版本 但我也想要一些本地的 javascript 文件 并且希望我想在本地目录中导入 angularjs
  • 在 Javascript 中动态创建 []array

    也许这将是一个真正愚蠢的问题 但我是 JavaScript 新手 并且坚持动态创建数组 如下格式 items Date 2012 01 21T23 45 10 280Z Value 7 Date 2012 01 26T23 45 10 28

随机推荐

  • R-markdown 自包含

    我正在使用 R markdown 来编写一些报告 我用独立的图形来做 因为我通过电子邮件发送它 这一直有效直到最近 但现在图像不再显示 方框中出现十字错误 可能是我更新了RStudio的版本 我在脚本的顶部使用了这个 title blabl
  • Fluent NHibernate Composite ID表问题

    我对 nhibernate 有点陌生 遇到了一个问题 我有以下表格 Table 1 我在使用复合 id 做事时遇到了很多问题 例如this 我建议做我所做的事情 即创建一个新类型 它只包含复合 id 用于 id 的内容 然后像这样映射它 C
  • Objective-C中如何将字节值转换为int

    请告诉我如何在 iPhone 编程中将 Objective C 中的字节转换为 NSInteger int 字节 是什么意思 如果要将表示整数值的单字节转换为 int 或 NSInteger 类型 只需使用 Byte b 123 NSInt
  • 全套组合组合 3 套

    我需要生成组合三个不同子集所获得的完整组合集 Set 1 从 13 个元素的向量中选择任意 4 个数字 Set 2 从 3 个元素的向量中选择任意 2 个数字 Set 3 从 9 个元素的向量中选择任意 2 个数字 示例 A 组的向量 4
  • 将 DataContractSurrogate 与 WCF REST 结合使用

    如何将 DataContractSurrogate 用于我的 WCF REST 服务 使用 WebServiceHostFactory 托管 我没有看到添加一个的方法 即使我添加自定义 IOperationBehavior WebServi
  • 如何用C语言为AVR-Studio编写自定义reset()函数?

    所以我被分配了为 AVR 编译编写自定义 Reset 函数的任务 我得到了这个信息 Atmega128 和 Pic24e 在程序地址 0x0 处有复位中断 编写一个函数 Reset 来复位程序 我还听说强制系统重新启动的一个简单方法是发送它
  • 从多个源文件构建内核模块,其中一个源文件与模块同名

    是否可以从多个源文件构建一个内核模块 其中一个源文件与该模块同名 例如 我想使用以下源文件构建 mymodule ko mymodule cmymodule func c 这个 makefile 不起作用 Makefile obj m my
  • UILabel + IRR、KRW 和 KHR 货币符号错误

    我在将韩元 柬埔寨瑞尔和伊朗里亚尔的十进制转换为货币并将结果显示到 UILabel 文本时遇到问题 转换本身顺利进行 我可以在调试器中看到正确的货币符号 甚至 NSLog 也能很好地打印该符号 如果我将此 NSString 实例分配给 UI
  • ListView项目背景地狱

    因为复选框不是我的项目的选项 所以我希望可选项在选中时有背景 从 2 3 开始支持 我还没有设法解决这个问题 选择是正确的 但我在屏幕上看到的不是 随机行的随机颜色 拳头我有这个
  • React Router 无法与 Github Pages 一起使用

    我以前的网站仅在单击主页选项卡时显示主页 然后如果您单击我的导航栏品牌 它会显示 404 该网站在带有 npm start 的 create react app 上运行 但在这里不起作用 也不起作用在构建上 我不知道该应用程序出了什么问题
  • 使用 Apache poi 在堆叠条上方显示 SUM 值

    我目前正在研究功能 应该在 pptx 文件内生成堆叠图表 为此 我使用这里的代码 java 使用 APACHE POI 在 powerpoint 中创建图表 我做了一些修改 主要是我将分组设置为 堆叠 并将重叠设置为 100 因此子栏看起来
  • 测试 jQuery 可选择 capybara 或 selenium (ctrl + click)

    我正在使用 jQuery Selectable 来管理日历 这个功能很好用 只需进入测试自动化即可 我需要从日历网格中选择多个不连续的日期 我尝试了一些方法 但并不真正期望它们能起作用 date 2013 05 02 page execut
  • Verilog HDL ?操作员

    什么是 用 Verilog 做什么 例如 以下命令是什么意思 input first din input 7 0 din output 127 0 parity reg 127 0 parity wire 7 0 feedback assi
  • 排除 $lookup 聚合中的字段

    我正在查询 3 个要排除的集合 id输出中随处可见 我的输出是 id ObjectId 5b6aed5f9bcdb5d4ae64aef5 userID 1 skills id ObjectId 5b766b5f1365a4940bb6050
  • 产品设置中的自定义复选框,选中时显示自定义字段

    我目前正在使用 WooCommerce 开发 WordPress 电子商务网站 我在产品编辑页面常规设置中创建了一个自定义复选框 我还有一个代码片段 用于在单个产品页面中显示自定义文本字段 现在 我希望当为产品选中此自定义复选框 在其设置中
  • RealityKit – 如何以编程方式访问场景中的属性?

    我一直通过从库下载来使用现实作曲家和框架实体 我想访问对象的属性 以编程方式提供要在框架中显示的图像 在这里您可以看到有一个配置 我可以从我的画廊导入照片 但我想以编程方式完成它 也就是说 我想访问框架对象的该属性并以编程方式提供图像 但我
  • Spark-HBase - GCP模板(2/3) - json4s的版本问题?

    我正在尝试在 GCP 上下文中测试 Spark HBase 连接器并尝试遵循1 它要求使用 Maven 我尝试过 Maven 3 6 3 为 Spark 2 4 本地打包连接器 2 并在提交作业时出现以下错误Dataproc 完成 3 之后
  • PrimeFaces Piechart:工具提示未在我的本地环境中显示

    我重新创建了 primefaces 展示中显示的示例页面 http www primefaces org showcase ui chart pie xhtml 饼图成功显示 我可以调整饼图模型以获取可用的 setter 和 getter
  • 从 dynamodb 流读取数据

    我为我的发电机表设置了流 我正在按照文档中的示例程序从流中读取数据 http docs aws amazon com amazondynamodb latest developerguide Streams LowLevel Walkthr
  • 快照视频作为预览

    我在从视频中获取快照用作标题图像时遇到问题 下面有我当前使用的代码 但我得到的输出只是一个黑色图像 在控制台中我没有遇到任何问题 我将视频上传到我使用的文件服务器后执行此操作 let video videoPath find newVide