整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          前端開發(fā)日報:應(yīng)用canvas獲取video的縮略圖

          前端開發(fā)日報:應(yīng)用canvas獲取video的縮略圖

          、應(yīng)用canvas獲取video的縮略圖

          發(fā)布視頻時候,經(jīng)常需要上傳同時上傳視頻的縮略圖,近日,應(yīng)產(chǎn)品經(jīng)理的的要求,需要做一個發(fā)布視頻動態(tài)的功能,我第一反應(yīng)就想到了H5的標(biāo)簽vidio和canvas,在這里記錄下我完成該功能的過程: 首先,整體思路是創(chuàng)建一個vidio,然后創(chuàng)建一個canvas和一個畫筆,調(diào)用畫筆的drawImage方法,將vidio作為參數(shù),就會畫出該視頻的縮略圖。

          https://segmentfault.com/a/1190000010910097

          2、MVVM開發(fā)總結(jié)——vue組件(你所需要知道的)

          隨著模塊化開發(fā)的理念越來越被開發(fā)者所重視,如何快速高效的開發(fā)項(xiàng)目成為了開發(fā)中所要注意的重點(diǎn)。在vue.js中組件系統(tǒng)作為一個重要的概念,它提供的組件可以獨(dú)立、重復(fù)的使用來構(gòu)建大型的應(yīng)用。組件可以擴(kuò)展HTML元素,封裝可重用的HTML代碼,我們可以將組件看作自定義的HTML元素。

          https://juejin.im/post/59a4bc7c518825244c0cfc10

          3、明白 JS 模塊化

          模塊化就是將一個大的功能拆分為多個塊,每一個塊都是獨(dú)立的,你不需要去擔(dān)心污染全局變量,命名沖突什么的。 那么模塊化的好處也就顯然易見了 解決命名沖突 依賴管理 代碼更加可讀 提高復(fù)用性

          https://juejin.im/post/59a575b06fb9a0247c6eee02

          4、Node.JS循環(huán)遞歸復(fù)制文件夾目錄及其子文件夾下的所有文件

          在Node.js中,要實(shí)現(xiàn)目錄文件夾的循環(huán)遞歸復(fù)制也非常簡單,使用fs模塊即可,僅需幾行,而且性能也不錯,我們先來實(shí)現(xiàn)文件的復(fù)制

          http://ourjs.com/detail/59a53a1ff1239006149617c6

          5、30 多年的軟件經(jīng)驗(yàn),總結(jié)出 10 個編寫出更好代碼的技巧

          好代碼可以定義為易讀、易懂、易調(diào)試、易改,最重要的還要少缺陷。顯然,要想敲出一手好代碼,是要花不少時間,但這在長久來看是有意義的,因?yàn)槟憧梢曰ǜ贂r間及精力去維護(hù)和復(fù)用你的代碼。   事實(shí)上,我們可以將好代碼等同于可復(fù)用的代碼,這也是下面提到的重要原則之一。代碼可能只是完成了編程工作中短期目標(biāo)的特定功能,但如果沒人(包括你自己)愿意復(fù)用你的代碼,這代碼在某種程度上可以說是不足且有缺陷的。要么太復(fù)雜、要么太具體、要么在不同情況下極有可能崩掉,或者其他程序員可能不相信你的代碼。

          http://geek.csdn.net/news/detail/234132

          6、Nodejs 進(jìn)階:使用 DiffieHellman 密鑰交換算法

          Diffie-Hellman(簡稱DH)是密鑰交換算法之一,它的作用是保證通信雙方在非安全的信道中安全地交換密鑰。目前DH最重要的應(yīng)用場景之一,就是在HTTPS的握手階段,客戶端、服務(wù)端利用DH算法交換對稱密鑰。 下面會先簡單介紹DH的數(shù)理基礎(chǔ),然后舉例說明如何在nodejs中使用DH相關(guān)的API。

          https://segmentfault.com/a/1190000010917737

          喜歡這篇文章的朋友,歡迎關(guān)注、收藏、分享、評論,幫我上熱門,你的支持,是我每日更新的動力!

          喜歡前端的朋友可以點(diǎn)擊關(guān)注一下我,每日分享精彩的前端文章!

          今日更多精彩文章:http://caibaojian.com/fe-daily-20170830.html



          者:Panda Shen

          轉(zhuǎn)發(fā)鏈接:https://www.overtaking.top/2018/06/21/20180621113025/

          何通過js調(diào)用本地?cái)z像頭呢?獲取后如何對視頻進(jìn)行截圖呢?在這里跟大家做一個簡易的Demo來實(shí)現(xiàn)以上幾個功能。

          涉及到的知識點(diǎn)

          • navigator.getUserMedia 可以通過該函數(shù)來打開攝像頭獲得流數(shù)據(jù)
          • canvas.drawImage 可以通過該函數(shù)來將視頻的某幀畫到canvas畫布上
          • canvas.toDataURL 可以通過該函數(shù)將canvas畫布生成圖片url

          實(shí)現(xiàn)的功能點(diǎn)

          • 打開攝像頭
          • 暫停攝像頭
          • 對視頻進(jìn)行截圖

          html簡單布局

          以下先通過HTML我們來實(shí)現(xiàn)一個簡單的布局,包括樣式和按鈕。

          <!DOCTYPE html>
          <html lang="en">
          <head>
              <meta charset="UTF-8">
              <title>H5 canvas 調(diào)用攝像頭進(jìn)行繪制</title>
              <style>
                  html,body{
                      width:100%;
                      height:100%;
                      padding: 0px;
                      margin: 0px;
                      overflow: hidden;
                  }
                  #canvas{
                      width:500px;
                      height:300px;
                  }
                  #video{
                      width:500px;
                      height:300px;
                  }
                  .btn{
                      display:inline-block;
                      text-align: center;
                      background-color: #333;
                      color:#eee;
                      font-size:14px;
                      padding:5px 15px;
                      border-radius: 5px;
                      cursor:pointer;
                  }
              </style>
          </head>
          <body>
              <video id="video" autoplay="true" style="background-color:#ccc;display:none;"></video>
              <div style="width:500px;height:300px;margin:30px auto;">
                  <canvas id="canvas" width="500px" height="300px">您的瀏覽器不支持H5 ,請更換或升級!</canvas>
                  <span class="btn" filter="screenshot">截圖</span>
                  <span class="btn" filter="close">暫停</span>
                  <span class="btn" filter="open">打開</span>
              </div>
              <div style="width:500px;height:300px;margin:40px auto;" id="show"></div>
          </body>
          </html>

          樣子差不多是這樣的:

          hahiahia 空白一片


          我們將video進(jìn)行了隱藏,然后加上了幾個按鈕,還有canvas以及最底部的圖片展示區(qū)域(用來存放截圖圖片)。

          js實(shí)現(xiàn)功能

          這里先貼下核心代碼:

          navigator.getUserMedia({
              video : {width:500,height:300}
          },function(stream){
              LV.video.srcObject=stream;
              LV.video.onloadedmetadata=function(e) {
                  LV.video.play();
              };
          },function(err){
              alert(err);//彈窗報錯
          })

          相關(guān)的知識點(diǎn)可以參考:https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia

          然后根據(jù)頁面邏輯實(shí)現(xiàn)事件以及其他功能,包括:截圖、暫停。

          navigator.getUserMedia=navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
              var events={
                  open : function(){
                      LV.open();
                  },
                  close : function(){
                      console.log(LV.timer);
                      clearInterval(LV.timer);
                  },
                  screenshot : function(){
                      //獲得當(dāng)前幀的圖像并拿到數(shù)據(jù)
                      var image=canvas.toDataURL('jpeg');
                      document.getElementById('show').innerHTML='<img src="'+image+'" style="width:500px;height:300px;" />'
                  }
              };
              var LV={
                  video : document.getElementById('video'),
                  canvas : document.getElementById('canvas'),
                  timer : null,
                  media : null,
                  open :function(){
                      if(!LV.timer){
                          navigator.getUserMedia({
                              video : {width:500,height:300}
                          },function(stream){
                              LV.video.srcObject=stream;
                              LV.video.onloadedmetadata=function(e) {
                                  LV.video.play();
                              };
                          },function(err){
                              alert(err);//彈窗報錯
                          })
                      }
                      if(LV.timer){
                          clearInterval(LV.timer);
                      }
                      //將畫面繪制到canvas中
                      LV.timer=setInterval(function(){
                          LV.ctx.drawImage(LV.video,0,0,500,300);
                      },15);
                  },
                  init : function(){
                      LV.ctx=LV.canvas.getContext('2d');
                      //綁定事件
                      document.querySelectorAll('[filter]').forEach(function(item){
                          item.onclick=function(ev){
                              var type=this.getAttribute('filter');
                              events[type].call(this,ev);
                          }
                      });
                      return LV;
                  }
              };
              LV.init();

          原諒我放蕩不羈的命名 ...


          具體已經(jīng)實(shí)現(xiàn)的demo可以點(diǎn)擊 https://chrunlee.cn/demos/canvas-video/index.html


          主站蜘蛛池模板: 亚洲爆乳精品无码一区二区三区| 日韩一区二区三区电影在线观看| 国产一区二区三区播放| 日韩免费无码一区二区视频| 乱码精品一区二区三区| 国产SUV精品一区二区四| 亚洲AV日韩AV一区二区三曲| 日韩精品一区二区三区中文精品 | 福利一区国产原创多挂探花| 在线观看中文字幕一区| 一区二区三区无码高清视频| 国产丝袜无码一区二区三区视频| 久久婷婷久久一区二区三区| 无码国产精品一区二区免费式直播| 天堂一区人妻无码| 国产一区二区在线视频播放| 在线精品动漫一区二区无广告| 一区二区在线电影| 男人免费视频一区二区在线观看| 久久青草精品一区二区三区| 国产一国产一区秋霞在线观看| 国产成人精品视频一区二区不卡 | 区三区激情福利综合中文字幕在线一区亚洲视频1 | 一区二区三区视频在线播放| 国产亚洲一区二区手机在线观看| 日韩一区二区三区不卡视频| 国产激情无码一区二区| 免费精品一区二区三区在线观看| 国模大尺度视频一区二区| 亚洲丰满熟女一区二区哦| 中文字幕人妻无码一区二区三区| 濑亚美莉在线视频一区| 国产精品视频一区二区三区| 国产在线视频一区| 亚洲成人一区二区| 丰满岳乱妇一区二区三区| 日本一区二区三区不卡视频中文字幕| 香蕉久久一区二区不卡无毒影院| 国产一区二区三区露脸| 无码视频一区二区三区| 性盈盈影院免费视频观看在线一区|