最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS打開攝像頭并截圖上傳示例

 更新時間:2017年02月18日 17:56:23   作者:imwtr  
本篇文章主要介紹了JS打開攝像頭并截圖上傳示例,詳細(xì)JS打開攝像頭并截圖上傳至后端的一個完整步驟,有興趣的同學(xué)可以了解一下。

直入正題,JS打開攝像頭并截圖上傳至后端的一個完整步驟

1. 打開攝像頭主要用到getUserMedia方法,然后將獲取到的媒體流置入video標(biāo)簽

2. 截取圖片主要用到canvas繪圖,使用drawImage方法將video的內(nèi)容繪至canvas中

3. 將截取的內(nèi)容上傳至服務(wù)器,將canvas中的內(nèi)容轉(zhuǎn)為base64格式上傳,后端(PHP)通過file_put_contents將其轉(zhuǎn)為圖片

要注意的是,在chrome以外的瀏覽器中,使用攝像頭或多或少會出現(xiàn)一些問題,可能也是老問題了,所以以下代碼主要基于chrome使用

比如在最新版FireFox中的報(bào)錯,不知為啥

1. 打開攝像頭

getUserMedia 有新版本和舊版本兩種,建議使用新版本

舊版本位于navigator 對象下,根據(jù)瀏覽器不同有所不同

 // 獲取媒體方法(舊方法)
  navigator.getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMeddia || navigator.msGetUserMedia; 
if (navigator.getMedia) {
    navigator.getMedia({
      video: true
    }, function(stream) {
      mediaStreamTrack = stream.getTracks()[0];

      video.src = (window.URL || window.webkitURL).createObjectURL(stream);
      video.play();
    }, function(err) {
      console.log(err);
    });
  } 

第一個參數(shù)中指示需要使用視頻(video)或音頻(audio)。

第二個參數(shù)中指示調(diào)用成功后的回調(diào),其中帶一個參數(shù)(MediaStream),在舊版本中可以直接通過調(diào)用MediaStream.stop() 來關(guān)閉攝像頭,不過在新版之中已廢棄。需要使用MediaStream.getTracks()[index].stop() 來關(guān)閉相應(yīng)的Track

第三個參數(shù)指示調(diào)用失敗后的回調(diào)

新版本位于navigator.mediaDevices 對象下

if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
    navigator.mediaDevices.getUserMedia({
      video: true,
      audio: true
    }).then(function(stream) {
      console.log(stream);

      mediaStreamTrack = typeof stream.stop === 'function' ? stream : stream.getTracks()[1];

      video.src = (window.URL || window.webkitURL).createObjectURL(stream);
      video.play();
    }).catch(function(err) {
      console.log(err);
    })
  } 

與舊版類似,不過該方法返回了一個Promise對象,可以使用then和catch表示成功與失敗的回調(diào)

需要注意的是,MediaStream.getTracks() 返回的Tracks數(shù)組是按第一個參數(shù)倒序排列的

比如現(xiàn)在定義了

{
  video: true,
  audio: true
} 

想關(guān)閉攝像頭,就需要調(diào)用MediaStream.getTracks()[1].stop();

同理,0對應(yīng)于audio的track

使用createObjectURL 將MediaStream寫入video標(biāo)簽,就能夠存儲實(shí)時的媒體流數(shù)據(jù)(也可以方便的實(shí)時查看畫面)

舊版本中webkitURL 對象以不被支持,需要使用URL對象

  <video width="200" height="150"></video>
  <canvas width="200" height="150"></canvas>

  <p>
    <button id="snap">截取圖像</button>
    <button id="close">關(guān)閉攝像頭</button>
    <button id="upload">上傳圖像</button>
  </p>

  <img id="uploaded" width="200" height="150" /> 

2. 截取圖像

將內(nèi)容寫入即可

 // 截取圖像
  snap.addEventListener('click', function() {
    context.drawImage(video, 0, 0, 200, 150);
  }, false); 

3. 關(guān)閉攝像頭

 // 關(guān)閉攝像頭
  close.addEventListener('click', function() {
    mediaStreamTrack && mediaStreamTrack.stop();
  }, false); 

4. 上傳截取的圖像

canvas.toDataURL('image/png')

// 上傳截取的圖像
  upload.addEventListener('click', function() {
    jQuery.post('/uploadSnap.php', {
      snapData: canvas.toDataURL('image/png')
    }).done(function(rs) {
      rs = JSON.parse(rs);

      console.log(rs);

      uploaded.src = rs.path;
    }).fail(function(err) {
      console.log(err);
    });
  }, false); 

而這里的后端(PHP)則將獲取的內(nèi)容轉(zhuǎn)換成圖像文件保存

需要注意的是,要將base64的頭部信息字段去掉再保存,否則似乎圖像是損壞無法打開滴

 <?php

  $snapData = $_POST['snapData'];
  $snapData = str_replace('data:image/png;base64,', '', $snapData);
  // $snapData = str_replace(' ', '+', $snapData);

  $img = base64_decode($snapData);

  $uploadDir = 'upload/';
  $fileName = date('YmdHis', time()) . uniqid();

  if (!(file_put_contents($uploadDir . $fileName, $img))) {
    echo json_encode(array('code' => 500, 'msg' => '文件上傳失敗'));
  } else {
    echo json_encode(array('code' => 200, 'msg' => '文件上傳成功', 'path' => $uploadDir . $fileName));
  }

?> 

完整JS代碼

<script type="text/javascript" src="jquery.js"></script>
  <script type="text/javascript">
  function $(elem) {
    return document.querySelector(elem);
  }

  // 獲取媒體方法(舊方法)
  navigator.getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMeddia || navigator.msGetUserMedia;

  var canvas = $('canvas'),
    context = canvas.getContext('2d'),
    video = $('video'),
    snap = $('#snap'),
    close = $('#close'),
    upload = $('#upload'),
    uploaded = $('#uploaded'),
    mediaStreamTrack;

  // 獲取媒體方法(新方法)
  // 使用新方法打開攝像頭
  if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
    navigator.mediaDevices.getUserMedia({
      video: true,
      audio: true
    }).then(function(stream) {
      console.log(stream);

      mediaStreamTrack = typeof stream.stop === 'function' ? stream : stream.getTracks()[1];

      video.src = (window.URL || window.webkitURL).createObjectURL(stream);
      video.play();
    }).catch(function(err) {
      console.log(err);
    })
  }
  // 使用舊方法打開攝像頭
  else if (navigator.getMedia) {
    navigator.getMedia({
      video: true
    }, function(stream) {
      mediaStreamTrack = stream.getTracks()[0];

      video.src = (window.URL || window.webkitURL).createObjectURL(stream);
      video.play();
    }, function(err) {
      console.log(err);
    });
  }

  // 截取圖像
  snap.addEventListener('click', function() {
    context.drawImage(video, 0, 0, 200, 150);
  }, false);

  // 關(guān)閉攝像頭
  close.addEventListener('click', function() {
    mediaStreamTrack && mediaStreamTrack.stop();
  }, false);

  // 上傳截取的圖像
  upload.addEventListener('click', function() {
    jQuery.post('/uploadSnap.php', {
      snapData: canvas.toDataURL('image/png')
    }).done(function(rs) {
      rs = JSON.parse(rs);

      console.log(rs);

      uploaded.src = rs.path;
    }).fail(function(err) {
      console.log(err);
    });
  }, false);

  </script>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • js禁止小鍵盤輸入數(shù)字功能代碼

    js禁止小鍵盤輸入數(shù)字功能代碼

    js禁止小鍵盤輸入數(shù)字功能代碼,需要的朋友可以參考下。
    2011-08-08
  • JavaScript學(xué)習(xí)筆記之取數(shù)組中最大值和最小值

    JavaScript學(xué)習(xí)筆記之取數(shù)組中最大值和最小值

    在實(shí)際業(yè)務(wù)中有的時候要取出數(shù)組中的最大值或最小值。但在數(shù)組中并沒有提供arr.max()和arr.min()這樣的方法。那么是不是可以通過別的方式實(shí)現(xiàn)類似這樣的方法呢?那么今天我們就來整理取出數(shù)組中最大值和最小值的一些方法,需要的朋友一起學(xué)習(xí)吧
    2016-03-03
  • 自己做的模擬模態(tài)對話框?qū)崿F(xiàn)代碼

    自己做的模擬模態(tài)對話框?qū)崿F(xiàn)代碼

    最近做完一個項(xiàng)目,發(fā)現(xiàn)瀏覽器兼容問題,模態(tài)對話框只有IE支持,但是IE9又不能支持帶框架的對話框,那個對話框的大小打死都設(shè)置不了,在網(wǎng)上查說因?yàn)楹枚喙δ鼙籌E9屏蔽了,于是自己做了一個模擬對話框的東西
    2012-05-05
  • js顯示動態(tài)時間的方法詳解

    js顯示動態(tài)時間的方法詳解

    這篇文章主要介紹了js顯示動態(tài)時間的方法,較為詳細(xì)的分析了javascript中Date對象的常用方法及功能,并結(jié)合實(shí)例形式分析了JS時間顯示功能,需要的朋友可以參考下
    2016-08-08
  • 簡單了解JavaScript中的執(zhí)行上下文和堆棧

    簡單了解JavaScript中的執(zhí)行上下文和堆棧

    這篇文章主要介紹了簡單了解JavaScript中的執(zhí)行上下文和堆棧,你應(yīng)該對解釋器了解得更清楚:為什么在聲明它們之前可以使用某些函數(shù)或變量?以及它們的值是如何確定的?,需要的朋友可以參考下
    2019-06-06
  • 用JavaScript實(shí)現(xiàn)類似于ListBox功能示例代碼

    用JavaScript實(shí)現(xiàn)類似于ListBox功能示例代碼

    這篇文章主要介紹了用JavaScript實(shí)現(xiàn)類似于ListBox功能,需要的朋友可以參考下
    2014-03-03
  • JavaScript中淺講ajax圖文詳解

    JavaScript中淺講ajax圖文詳解

    ajax對于各位來說,應(yīng)該都不陌生,正因?yàn)閍jax的產(chǎn)生,導(dǎo)致前臺頁面和服務(wù)器之間的數(shù)據(jù)傳輸變得非常容易,同時還可以實(shí)現(xiàn)頁面的局部刷新。本文圖文并茂給大家介紹了js中ajax知識,需要的朋友一起學(xué)習(xí)吧
    2016-11-11
  • nodejs創(chuàng)建web服務(wù)器之hello world程序

    nodejs創(chuàng)建web服務(wù)器之hello world程序

    本文給大家分享nodejs創(chuàng)建web服務(wù)器之hello world程序,node真的很好用,不僅用v8引擎來解析了javascript外,還提供了高度優(yōu)化的應(yīng)用庫,真的很好,有需要的朋友一起來學(xué)習(xí)吧
    2015-08-08
  • 詳解原生JavaScript實(shí)現(xiàn)jQuery中AJAX處理的方法

    詳解原生JavaScript實(shí)現(xiàn)jQuery中AJAX處理的方法

    這篇文章主要介紹了原生JavaScript實(shí)現(xiàn)jQuery中AJAX處理的方法,作者根據(jù)jQuery中一些對AJAX請求的處理方式來用原生API實(shí)現(xiàn),需要的朋友可以參考下
    2016-05-05
  • JS正則表達(dá)式驗(yàn)證端口范圍(0-65535)

    JS正則表達(dá)式驗(yàn)證端口范圍(0-65535)

    這篇文章主要介紹了JS正則表達(dá)式驗(yàn)證端口范圍(0-65535),文中給大家提到了Js正則表達(dá)式驗(yàn)證IP+端口號的代碼,需要的朋友可以參考下
    2020-01-01

最新評論

上高县| 柳江县| 水富县| 宜州市| 封开县| 山阳县| 鹿泉市| 长顺县| 西青区| 清流县| 格尔木市| 双柏县| 阿图什市| 连云港市| 永兴县| 建始县| 三亚市| 和平县| 福清市| 永顺县| 滁州市| 泰安市| 响水县| 永清县| 和林格尔县| 山东| 醴陵市| 大竹县| 绥芬河市| 临清市| 邯郸县| 临潭县| 白水县| 武义县| 阿克陶县| 绵阳市| 门头沟区| 郎溪县| 普宁市| 长宁县| 武功县|