【html】利用生成器函数和video元素,取出指定时间的视频画面

这篇具有很好参考价值的文章主要介绍了【html】利用生成器函数和video元素,取出指定时间的视频画面。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简言

有的时候想截取视频某一秒的视频画面。
手动截取操作麻烦,还得时刻关注视频播放时间。
于是,我搞出来了一个根据视频自动截取特定时间描述的页面。

效果

【html】利用生成器函数和video元素,取出指定时间的视频画面,前端,前端,html5

【html】利用生成器函数和video元素,取出指定时间的视频画面,前端,前端,html5
【html】利用生成器函数和video元素,取出指定时间的视频画面,前端,前端,html5文章来源地址https://www.toymoban.com/news/detail-732274.html

实现步骤

  1. 获取视频对象
  2. 根据视频时长生成时间选择表单
  3. 根据表单选择的时间和视频地址,利用canvas和vido元素生成某一帧的视频画面图片
  4. 图片实现下载

源码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>处理视频</title>
  <style>
    .container {
      margin: 50px;
    }
  </style>
</head>

<body>
  <div class="container">
    <div class="upload__box">
      <input id="upVideo" name="upVideo" type="file" accept="video/*" placeholder="上传视频" />

    </div>
    <div class="video__box">
      <video width="800" height="450" id="video" src="" controls></video>
    </div>
    <div class="select__box">

    </div>
    <div class="analyze__text">

      <ul>

      </ul>
    </div>
  </div>

  <script>
    const upVideoDom = document.getElementById("upVideo")
    const videoDom = document.getElementById('video')
    const selectBoxDom = document.querySelector('.select__box')
    const TextListDom = document.querySelector('.analyze__text')
    upVideoDom.addEventListener("change", (e) => {
      const file = e.target.files[0];
      let videoURL = URL.createObjectURL(file)
      videoDom.src = videoURL

      videoDom.onloadedmetadata = (e) => {
        //  视频时长
        let videoDuration = e.target.duration
        createTimeSelectDom(videoDuration)
      }

    })
    //  根据时长创建dom选择器
    function createTimeSelectDom(duration) {
      //  生成可选秒数列表
      let fragDom = document.createDocumentFragment()
      let form = document.createElement("form")
      form.id = 'selectForm'
      form.name = 'selectForm'
      if (duration < 60) {
        let selectDom = document.createElement("select")
        selectDom.multiple = true
        selectDom.form = "selectForm"
        selectDom.name = "seconds"
        let optionDom = document.createElement("option")
        optionDom.innerText = '--选择秒数--'
        optionDom.value = ''
        selectDom.appendChild(optionDom)
        for (let i = 0; i < duration; i++) {
          let item = i.toString().padStart(2, '0')
          let optionDom = document.createElement("option")
          optionDom.innerText = item
          optionDom.value = item
          selectDom.appendChild(optionDom)
        }
        form.appendChild(selectDom)
      } else if (duration < 3600) {
        let minute = duration / 60
        let seconds = duration % 60
        let miuteSelectDom = document.createElement("select")
        miuteSelectDom.form = "selectForm"
        miuteSelectDom.name = "mintue"
        let optionDom = document.createElement("option")
        optionDom.innerText = '--选择分--'
        optionDom.value = ''
        miuteSelectDom.appendChild(optionDom)
        for (let i = 0; i < minute; i++) {
          let item = i.toString().padStart(2, '0')
          let optionDom = document.createElement("option")
          optionDom.innerText = item
          optionDom.value = item
          miuteSelectDom.appendChild(optionDom)
        }
        let secondsSelectDom = document.createElement("select")
        secondsSelectDom.multiple = true
        secondsSelectDom.form = "selectForm"
        secondsSelectDom.name = "seconds"
        let optionDom2 = document.createElement("option")
        optionDom2.innerText = '--选择秒数--'
        optionDom2.value = ''
        secondsSelectDom.appendChild(optionDom2)
        for (let i = 0; i < 59; i++) {
          let item = i.toString().padStart(2, '0')
          let optionDom = document.createElement("option")
          optionDom.innerText = item
          optionDom.value = item
          secondsSelectDom.appendChild(optionDom)
        }
        form.appendChild(miuteSelectDom)
        form.appendChild(secondsSelectDom)

      } else {

      }
      let submitInput = document.createElement("input")
      submitInput.type = 'submit'
      submitInput.value = '确定'
      form.onsubmit = formSubmit
      form.appendChild(submitInput)
      let resetInput = document.createElement("input")
      resetInput.type = 'reset'
      resetInput.value = '重置'
      form.appendChild(resetInput)
      fragDom.appendChild(form)
      selectBoxDom.appendChild(fragDom)
    }
    function formSubmit(e) {
      e.preventDefault()
      let mintueV = '00'
      if (selectForm.mintue) {
        mintueV = selectForm.mintue.value
      }
      let timeList = []
      for (let v of selectForm.seconds.options) {
        if (v.selected) {
          timeList.push(`${mintueV}:${v.value}`)
        }
      }
      //  生成帧图片
      TextListDom.children[0].innerHTML = ''
      createFramepicture({
        url: videoDom.src, timeList
      })
    }
    //  生成帧图片列表
    function createFramepicture({ url, timeList, }) {
      if (!url || !timeList) return
      let time;

      const video = document.createElement('video')
      video.width = 160
      video.height = 90
      video.crossorigin = "anonymous"
      video.src = url

      let canvas = document.createElement("canvas"),
        width = video.width,
        height = video.height;
      canvas.width = width
      canvas.height = height

      function* createTime() {
        for (let k = 0; k < timeList.length; k++) {
          time = timeList[k]


          let timeArr = time.split(':')
          let currentTime = Number(timeArr[0]) * 60 + Number(timeArr[1])

          video.currentTime = currentTime //  会导致 oncanplaythrough重新触发
          yield true


        }
      }
      let a = createTime()
      video.oncanplaythrough = () => {

        if (time) {
          //  当time存在时再渲染,避开video第一次加载成功
          analyzeVideo(video, time, canvas)
        }
        a.next()

      }


    }
    function analyzeVideo(video, time, canvas) {
      const ctx = canvas.getContext('2d')

      // ctx.clearRect(0, 0, video.width, video.height)
      ctx.drawImage(video, 0, 0, video.width, video.height);
      let dataURL = canvas.toDataURL("image/png")
      let li = document.createElement('li')

      let img = document.createElement('img')
      img.src = dataURL
      let p = document.createElement('p')
      p.innerText = `${time}`

      let btn = document.createElement('button')
      btn.innerText = '下载'
      btn.onclick = () => {
        downloadImg(dataURL, time)
      }
      li.appendChild(p)
      li.appendChild(img)
      li.appendChild(btn)

      const fragDom = document.createDocumentFragment()
      fragDom.appendChild(li)

      TextListDom.children[0].appendChild(fragDom)


    }


    function downloadImg(src, time) {
      let a = document.createElement('a')
      a.href = src
      a.download = `frame picture`
      a.click()
    }
  </script>
</body>

</html>

结果

到了这里,关于【html】利用生成器函数和video元素,取出指定时间的视频画面的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中函数,装饰器,迭代器,生成器

    1.函数可以作为参数进行传递 2.函数可以作为返回值进行返回 3.函数名称可以当成变量一样进行赋值操作 作用:在不改变原有函数调用的情况下,给函数增加新的功能          即可以在函数前面增加新的功能,但不改变原来的代码 可迭代的数据类型都会提供迭代器,即可以

    2024年02月07日
    浏览(41)
  • JavaScript 生成器函数详解:优雅处理异步任务流

    目录 1. 生成器函数的定义和使用 2. 暂停和恢复执行 3. 与其他语言特性的配合使用 Iterator Protocol 迭代器协议  解构赋值  生成器和 Promise 的组合使用          使用 Promise:         使用 async/await: 委托给另外一个Generator函数         Generators 是 JavaScript 中的一种

    2024年02月12日
    浏览(54)
  • ES6-2:Iterator、Proxy、Promise、生成器函数...

    打印出的是里面的内容,如果是for in打印出来的是索引,of不能遍历对象 Symbol.iterator是js内置的,可以访问直接对象arr[Symbol.iterator],()调用 对象非线性一般不能迭代 后两个是伪数组,但是是真迭代器接口 类似于数组,但成员的值都是唯一的,没有重复 与数组不同的是set没有

    2024年04月11日
    浏览(47)
  • 伪随机生成器(rand函数),随机数种子(srand函数)详细解读与分析:

    a.生成随机数; b.生成0~100以内的随机数 c.随机数的连续输出及其连续输出情况讲解与分析 首先我们来看一下rand函数(伪随机数生成器):   rand函数,即伪随机数生成器,该函数返回类型为整型,没有参数,即产生一个在(0-rand_max(十六进制的ox7ffff转化为整数即32767)的一个

    2024年02月11日
    浏览(50)
  • 【python基础语法六】迭代器,生成器,推导式和高阶函数

    内置函数: dir 获取当前对象的内置成员 高阶函数 : 能够把函数当成参数传递的就是高阶函数 (map ,filter ,reduce , sorted) 案例: 1. enumerate 2. zip 元组推导式是生成器( generator ) (1) 基本语法 (2) 优化生成器代码 (3) send 的使用方式 (给上一个 yield 发送数据) (4) yield from 的使用 (5) 案例

    2024年02月02日
    浏览(46)
  • 手机通话记录生成器在线,通话记录生成器下载,通话记录生成器app

    在了解通话记录生成器app的时候,铁牛通话记录生成器是一个为用户一键自动生成通话记录的app。如何得到“铁牛通话记录生成器”?在手机上进去佰渡baidu搜嗦,铁牛通话记录生成器,这几个字就可以,其他的不用输入。或者你看这个几个字母jp155再加上一个点com,手动输入

    2024年02月08日
    浏览(86)
  • python3 生成器与生成器表达式

    在 Python3 中,生成器表达式是一种语言结构,它可以快速地创建一个可迭代对象。生成器表达式类似于列表推导式,但使用圆括号而不是方括号,并且返回的是一个生成器对象而不是一个列表。 在 Python3 中,生成器表达式有两种类型:生成器函数和生成器表达式。 生成器函

    2024年02月02日
    浏览(81)
  • 关键词生成器在线-在线免费关键词生成器

    生成,什么是生成,生成就是根据你输入的一个生成成千上百的核心,围绕着你输入的核心词来生成的,优先生成大量用户搜索的,今天就给大家分享一款免费生成工具,生成的来源主要是用户都在搜索的词,相关搜索的

    2024年02月04日
    浏览(219)
  • ai论文生成器哪家好用?ai写作生成器免费

    AI论文生成器的好坏取决于具体的需求和场景,因此很难一概而论。以下是一些常见的AI论文生成器,供您参考: AIPaperPass:这是一款全智能自动写作平台,拥有自主模型并对外开放API接口。它可以根据用户提供的和要求,自动生成高质量的文章内容,并且支持批量写作

    2024年01月19日
    浏览(88)
  • AI绘画生成器推荐AI绘画自动生成器有哪些?

    1、DALL-E2 DALL-E2 是由 OpenAI 开发的 AI 图像生成器。只需几分钟,你就可以使用 AI 创建高度逼真的图像。 2、Deep Dream Generator Deep Dream是一个经过数百万张图像训练的神经网络。使用方便,只需要上传一张图片,工具即可根据原图生成新图片。 3、Artbreeder Artbreeder一款图像质量增

    2024年02月06日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包