JS实现预加载视频音频/视频获取截图(返回canvas截图)

下面是“JS实现预加载视频音频/视频获取截图(返回canvas截图)”的完整攻略。

一、准备工作

首先要在HTML文件中引入jQuery和video.js库:

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link href="https://vjs.zencdn.net/7.15.4/video-js.css" rel="stylesheet" />
<script src="https://vjs.zencdn.net/7.15.4/video.min.js"></script>

二、预加载视频音频

使用 video.js 加载音频视频,并设置 preload 属性为 auto,实现自动加载。

<video id="myvideo" class="video-js vjs-default-skin" preload="auto" width="640" height="264">
  <source src="your_video_path.mp4" type="video/mp4" />
  <source src="your_video_path.webm" type="video/webm" />
  <source src="your_video_path.ogg" type="video/ogg" />
</video>

三、截取视频画面生成图片

视频截图需要依赖 canvas,截图需要在视频播放前或者播放时执行。

1.添加一个空的canvas元素:

<canvas id="mycanvas"></canvas>

2.使用 video.js 开始播放:

const myPlayer = videojs('myvideo');
myPlayer.play();

3.在 video.js 中,提供了 createTimeRange() 方法,该方法用于自动创建表示整个视频的范围,并返回 TimeRanges 对象,该对象包含一系列范围和其长度。

针对 TimeRanges 移除有效的视频帧:

myPlayer.on('timeupdate', function() {
    const timeRanges = myPlayer.buffered();
    let bufferedTime = 0;

    // 遍历 TimeRanges 的长度
    for(let i = 0; i < timeRanges.length; i++) {
        bufferedTime += timeRanges.end(i) - timeRanges.start(i);
    }

    // 如果bufferedTime大于播放器的当前时间,表示已经加载完毕至少一个关键帧
    if(bufferedTime >= myPlayer.currentTime()) {

        //获取当前画面
        const $canvas = $('#mycanvas');
        const canvas = $canvas[0];

        const ctx = canvas.getContext('2d');

        canvas.width = myPlayer.videoWidth()
        canvas.height = myPlayer.videoHeight()
        ctx.drawImage(myPlayer.el(), 0, 0, canvas.width, canvas.height);

        // 获取 canvas 截图数据
        const dataURL = canvas.toDataURL();
        console.log(dataURL);
    }
})

在每一帧播放时间改变的时候,使用 canvas 抓取出当前帧的图片,并利用 toDataURL() 方法获取图片数据。

示例

示例一

一个基于 video.js + jQuery 的简单应用,预加载音频视频,开始播放后实时截取视频画面并生成图片。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Video screenshot</title>
  <link href="https://vjs.zencdn.net/7.15.4/video-js.css" rel="stylesheet" />
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  <script src="https://vjs.zencdn.net/7.15.4/video.min.js"></script>
</head>

<body>
  <button id="btn">Capture</button>
  <br>
  <video id="myvideo" class="video-js vjs-default-skin" preload="auto" width="640" height="264">
    <source src="https://vjs.zencdn.net/v/oceans.mp4" type="video/mp4" />
  </video>
  <canvas id="mycanvas"></canvas>

  <script>
    $(function() {
      const myPlayer = videojs('myvideo');
      myPlayer.play();

      myPlayer.on('timeupdate', function() {
        const timeRanges = myPlayer.buffered();
        let bufferedTime = 0;

        for(let i = 0; i < timeRanges.length; i++) {
          bufferedTime += timeRanges.end(i) - timeRanges.start(i);
        }

        if(bufferedTime >= myPlayer.currentTime()) {
          const $canvas = $('#mycanvas');
          const canvas = $canvas[0];

          const ctx = canvas.getContext('2d');

          canvas.width = myPlayer.videoWidth()
          canvas.height = myPlayer.videoHeight()
          ctx.drawImage(myPlayer.el(), 0, 0, canvas.width, canvas.height);

          const dataURL = canvas.toDataURL();
          console.log(dataURL);
        }
      })


      $('#btn').on('click', function () {
        const dataURL = canvas.toDataURL();
        const url = window.URL.createObjectURL(dataURL);

        const a = document.createElement('a');
        document.body.append(a);
        a.href = url;
        a.download = 'screenshot.png';
        a.click();

        setTimeout(() => {
          window.URL.revokeObjectURL(url);
          a.remove();
        }, 100)
      })
    });
  </script>
</body>

</html>

示例二

一个基于 video.js + Vue.js 的全功能应用,预加载音频视频,开始播放后实时截取视频画面并生成图片。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Video screenshot</title>
  <link href="https://vjs.zencdn.net/7.15.4/video-js.css" rel="stylesheet" />
  <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.14/vue.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  <script src="https://vjs.zencdn.net/7.15.4/video.min.js"></script>
</head>

<body>
  <div id="app">
    <div class="controls">
      <button @click="play" :disabled="playing">播放</button>
      <button @click="pause" :disabled="!playing">暂停</button>
      <button @click="capture" :disabled="!playing">截屏</button>
    </div>
    <div class="player-container">
      <video id="myvideo" class="video-js vjs-default-skin" preload="auto" v-bind:width="width" v-bind:height="height">
        <source v-bind:src="src" type="video/mp4" />
      </video>
      <canvas id="mycanvas" class="player-canvas"></canvas>
    </div>
  </div>

  <script>
    const app = new Vue({
      el: '#app',
      data: {
        src: 'https://vjs.zencdn.net/v/oceans.mp4',
        width: 640,
        height: 264,
        playing: false,
      },
      computed: {
        videoPlayer: function() {
          return videojs('myvideo')
        }
      },
      methods: {
        play() {
          this.videoPlayer.play()
          this.playing = true;
        },
        pause () {
          this.videoPlayer.pause()
          this.playing = false;
        },
        capture() {
          const $canvas = $('#mycanvas');
          const canvas = $canvas[0];
          const ctx = canvas.getContext('2d');
          const video = this.videoPlayer.el();

          canvas.width = video.videoWidth;
          canvas.height = video.videoHeight;

          ctx.drawImage(video, 0, 0, canvas.width, canvas.height);

          const dataURL = canvas.toDataURL();
          console.log(dataURL);
        },
      },
      mounted() {
        this.videoPlayer.play();
        this.playing = true;

        this.videoPlayer.on('timeupdate', function() {
          const timeRanges = this.buffered();
          let bufferedTime = 0;

          for(let i = 0; i < timeRanges.length; i++) {
            bufferedTime += timeRanges.end(i) - timeRanges.start(i);
          }

          if(bufferedTime >= this.currentTime()) {
            const $canvas = $('#mycanvas');
            const canvas = $canvas[0];
            const ctx = canvas.getContext('2d');
            const video = this.el();

            canvas.width = video.videoWidth;
            canvas.height = video.videoHeight;

            ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
          }
        });
      }
    })
  </script>
</body>

</html>

四、总结

以上就是本次攻略的完整内容,通过上述步骤可以轻松地预加载音频视频并实现获取视频截图的功能,同时,两个示例也提供了帮助我们更加快速高效完成音视频处理工作的方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS实现预加载视频音频/视频获取截图(返回canvas截图) - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • CSS样式书写顺序和命名规范及注意事项

    下面我来为您详细讲解CSS样式书写顺序和命名规范及注意事项的完整攻略。 CSS样式书写顺序 为了保证CSS代码的可维护性和清晰度,我们需要养成良好的CSS样式书写习惯,按照以下顺序书写CSS样式代码。 布局定位属性(display、position、float、clear等) 盒模型属性(width、height、padding、margin等) 字体属性(…

    css 2023年6月9日
    00
  • css画一个棒棒糖的实例代码

    下面是“CSS画一个棒棒糖”的实例代码攻略,具体步骤如下: 1. 画出棒棒糖的形状 首先,我们可以使用倾斜的矩形和圆形来绘制棒棒糖的形状。 例如,我们可以使用以下代码来创建棒棒糖的形状: .lollipop { width: 50px; height: 120px; position: relative; background: #f00; border-r…

    css 2023年6月9日
    00
  • CSS缩写优化CSS文件的体积

    CSS缩写优化可以减少CSS文件的体积以加快网站的加载速度。下面是优化CSS文件的体积过程中的攻略: 第一步:减少重复的代码 当有重复的代码时,可以通过缩写属性来减少体积。比如可以把下面的代码: h1 { font-style: normal; font-variant: normal; font-weight: normal; font-size: 2em…

    css 2023年6月10日
    00
  • bootstrap3.0教程之多种表格效果(条纹状表格、条纹状表格、鼠标悬停等)

    标题:Bootstrap3.0教程之多种表格效果 前言 在网站制作中,表格是常用的页面元素之一。Bootstrap3.0为我们提供了多种表格效果,可以让我们在设计网站时更加灵活多样化。本篇教程将详细讲解如何利用Bootstrap3.0实现多种表格效果。 条纹状表格 概述 条纹状表格在Bootstrap3.0中是非常常见的一种表格风格,其配色简洁明快,同时也能…

    css 2023年6月10日
    00
  • php防止恶意刷新与刷票的方法

    以下是详细讲解“php防止恶意刷新与刷票的方法”的完整攻略。 什么是恶意刷新与刷票 在讲解如何防止恶意刷新与刷票之前,首先需要了解什么是恶意刷新与刷票。 恶意刷新是指某个用户不断地刷新网页,以达到干扰正常网站运行和占用服务器资源的目的。 刷票是指某个用户利用程序或其他手段,进行大量投票行为,旨在达到造假,篡改网站排名等目的。 这两种行为都会严重影响网站的安全…

    css 2023年6月10日
    00
  • CSS3 3D位移translate效果实例介绍

    让我来为您详细讲解“CSS3 3D位移translate效果实例介绍”完整攻略。 简介 CSS3 3D位移translate效果是利用CSS3的transform属性实现的一种动画效果,可以在多维度上改变元素的位置,实现复杂的动画效果,比如折叠、旋转、滑动等。 基本用法 下面的示例演示了如何使用CSS3 3D位移translate效果,将一个div元素向右平…

    css 2023年6月10日
    00
  • 手把手教你用纯css3实现轮播图效果实例

    让我来为您详细讲解“手把手教你用纯css3实现轮播图效果实例”的攻略。 手把手教你用纯CSS3实现轮播图效果实例 1. 前言 轮播图是现代网站中常见的一种元素。在这篇文章中,我们将使用CSS3实现一个轮播图。使用CSS3来实现轮播图可以减少网站的请求次数,而且使动画效果更加流畅。 2. HTML结构 要创建一个轮播图,我们需要一个图片列表和一个导航列表,其中…

    css 2023年6月9日
    00
  • div中加入span右对齐后出现换行显示两种解决思路

    让我来详细讲解一下“div中加入span右对齐后出现换行显示两种解决思路”。 首先,我们先来看一下问题的具体描述。 当我们在一个 div 中加入一个 span,并在 CSS 中给该 span 设定为右对齐时,如果 div 宽度不足以容纳该 span,那么就会出现换行的情况。我们希望解决这个问题,使得该 span 仍然可以右对齐,且不会出现换行的情况。 接下来…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部