使用Chrome采集摄像头并生成视频下载

主要使用2个技术点:WebRtc 的 getUserMedia 和 MediaRecorder

注意点

参考资料

代码如下

<!DOCTYPE html>
<html lang="en">
  <head>
    <title></title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body>
    <video width="400" height="300" controls id="video" autoplay></video>
    <div>
      <button type="button" id="record">record</button>
      <button type="button" id="pause">pause</button>
      <button type="button" id="resume">resume</button>
      <button type="button" id="stop">stop</button>
      <button type="button" id="finish">finish</button>
      <a href="#" target="_blank" id="download">download</a>
    </div>
    <div>
      <button type="button" id="info">info</button>
      <button type="button" id="isTypeSupported">isTypeSupported</button>
    </div>

    <script type="text/javascript">
      (function () {
        let mediaRecorder = null;
        let mediaStream = null;
        let chunks = [];

        function getMediaStream(params) {
          var constraints = {
            audio: true,
            video: true
          };

          return navigator
            .mediaDevices
            .getUserMedia(constraints);
        }

        function attachMedia() {
          getMediaStream()
            .then(stream => {
              document.querySelector(‘#video‘).srcObject = stream;
              mediaStream = stream;
            })
            .catch(err => alert(`${err.name}: ${err.message}`));
        }

        function record() {
          mediaRecorder = new MediaRecorder(mediaStream, { mimeType:"video/webm" });

          mediaRecorder.addEventListener(‘dataavailable‘, e => {
            console.log(‘dataavailable %o‘, e);
                chunks.push(e.data);
          });
          mediaRecorder.addEventListener(‘error‘, e => console.log(‘error %o‘, e));
          mediaRecorder.addEventListener(‘pause‘, e => console.log(‘pause %o‘, e));
          mediaRecorder.addEventListener(‘resume‘, e => console.log(‘resume %o‘, e));
          mediaRecorder.addEventListener(‘start‘, e => console.log(‘start %o‘, e));
          mediaRecorder.addEventListener(‘stop‘, e => console.log(‘stop %o‘, e));

          // 调用时可以通过给timeslice参数设置一个毫秒值,如果设置这个毫秒值,那么录制的媒体会按照你设置的值进行分割成一个个单独的区块, 而不是以默认的方式录制一个非常大的整块内容.
          mediaRecorder.start(10);
        }

        function stop() {
          mediaRecorder.stop();
        }

        function pause() {
          mediaRecorder.pause();
        }

        function resume() {
          mediaRecorder.resume();
        }

        function stop() {
          mediaRecorder.stop();
        }

        function download() {
          var blob = new Blob(chunks, {type: "video/webm"});

          chunks = [];

          var downloadLink = document.querySelector(‘a#download‘);
          var videoURL = window.URL.createObjectURL(blob);
          var rand =  Math.floor((Math.random() * 10000000));
          var name  = "video_"+rand+".webm" ;

          downloadLink.href = videoURL;
          downloadLink.setAttribute( "download", name);
          downloadLink.setAttribute( "name", name);
        }

        function info() {
          console.log(`mimeType ${mediaRecorder.mimeType}`);
          console.log(`state ${mediaRecorder.state}`);
          console.log(`stream ${mediaRecorder.stream}`);
          console.log(`videoBitsPerSecond %o`, mediaRecorder.videoBitsPerSecond);
          console.log(`audioBitsPerSecond ${mediaRecorder.audioBitsPerSecond}`);
        }

        function isTypeSupported() {
          var types = [
            "video/webm",
            "audio/webm",
            "video/webm\;codecs=vp8",
            "video/webm\;codecs=daala",
            "video/webm\;codecs=h264",
            "audio/webm\;codecs=opus",
            "video/mpeg"
          ];

          for (var i in types) {
            console.log(`Is ${types[i]} supported? ${MediaRecorder.isTypeSupported(types[i] ? "Maybe!" : "No")}`);
          }
        }

        document.querySelector(‘#record‘).addEventListener(‘click‘, e => record());
        document.querySelector(‘#pause‘).addEventListener(‘click‘, e => pause());
        document.querySelector(‘#resume‘).addEventListener(‘click‘, e => resume());
        document.querySelector(‘#stop‘).addEventListener(‘click‘, e => stop());
        document.querySelector(‘#finish‘).addEventListener(‘click‘, e => download());

        document.querySelector(‘#info‘).addEventListener(‘click‘, e => info());
        document.querySelector(‘#isTypeSupported‘).addEventListener(‘click‘, e => isTypeSupported());

        attachMedia();
      })()
    </script>
  </body>
</html>
时间: 2024-08-30 13:36:21

使用Chrome采集摄像头并生成视频下载的相关文章

音视频下载Chrome插件 官方主页

音视频下载是个点击图标后就能下载网页里正在播放的音视频文件的软件 下载:百度网盘    Chrome网上应用商店 使用:视频演示   图文解说 需要先播放网页里的音视频才能看到软件图标! 本软件主打在线音乐下载,除了支持网易云音乐.虾米音乐.酷我音乐.百度音乐.一听音乐外.喜马拉雅FM.荔枝FM.企鹅FM,还支持其它很多网站,具体支持哪些网站无法全部罗列出来,无限惊喜等你发现! 它也可以用来下载网易公开课.Coursera等网站上面的视频.You can also use this Chrome

慕课网视频下载

1.使用js脚本批量下载慕课网视频 慕课网(http://www.imooc.com/)上有很多不错的视频,当然我不是来给慕课网打广告的,我本人学习过很多慕课网上的免费的视频. 在线看如果网速慢时,可能会有卡顿,没网时无法观看.所有说下载到本地,离线看视频是非常不错的选择.慕课网上没提供下载视频的入口,想下载到本地怎么办? 如果一次下载一个视频,那是very very easy,不用第三方工具就能搞定. 1.打开谷歌或谷歌内核的浏览器,按F12键,打开开发人员工具,地址栏输入http://www

基于opencv在摄像头ubuntu根据视频获取

 基于opencv在摄像头ubuntu根据视频获取 1  工具 原料 平台 :UBUNTU12.04 安装库  Opencv-2.3 2  安装编译执行步骤 安装编译opencv-2.3  參考http://blog.csdn.net/xiabodan/article/details/23547847 提前下载OPENCV源代码包 官方:http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/ 我的:http://dow

Directshow_驱动摄像头预览视频

出于兴趣一直以来都断断续续看过dshow的东西,可没怎么系统地总结过(学习还是要多实践,多总结啊). dshow预览摄像头捕捉的视频比较简单基础,网上相关的资料很多,简单的思路由下面代码所示: ICaptureGraphBuilder2 *pBuild; // Capture Graph Builder // Initialize pBuild (not shown). IBaseFilter *pCap; // Video capture filter. /* Initialize pCap

利用FFmpeg生成视频缩略图 2.1.8

1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ D:\ffmpeg 目录追加到系统 PATH 环境变量中; 2.运行 copy_to_ffmpeg.bat, 把 echoc.exe LED_font.ttf 文件拷贝到 D:\ffmpeg\ 目录下. echoc.exe 在CMD控制台环境下输出彩色字符; LED_font.ttf 用于输出时间戳

QT creator中使用opencv采集摄像头信息

之前在QT creator上成功编译了opencv,由于课题需要,需要采集摄像头的信息.故搜集了网上的一些资料,依葫芦画瓢的照着做了一下,终于简单的成功采集了信息. 打开QTcreator,新建一个widget工程. 在界面上放两个label 分别用来显示摄像头采集到的数据和照的照片. 在widget.h中的源代码如下: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QImage> #include &

利用FFmpeg生成视频缩略图

1.下载FFmpeg文件包,解压包里的\bin\下的文件解压到 D:\ffmpeg\ 目录下. 下载地址 http://ffmpeg.zeranoe.com/builds/win32/static/ 2.运行 copy_to_ffmpeg.bat, 把 echoc.exe LED_font.ttf 文件拷贝到 D:\ffmpeg\ 目录下. echoc.exe 在CMD控制台环境下输出彩色字符; LED_font.ttf 用于输出时间戳的字体文件; 3.Make_Thumbnail.bat 可带

Python3网络爬虫(八):爱奇艺等主流视频网站的VIP视频破解(在线观看+视频下载)

转载请注明作者和出处:http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 一.前言 没有会员,想在线观看或下载爱奇艺.PPTV.优酷.网易公开课.腾讯视频.搜狐视频.乐视.土豆.A站.B站等主流视频网站的VIP视频?又不想充会员怎么办?博主本次写的VIP视频破解助手也许可以帮你解决烦恼. 二.软件使用说明 1.软件下载 软件运行平台:Windows 注意:该软件已经打包成exe可

手把手教你用python打造网易公开课视频下载软件3-对抓取的数据进行处理

上篇讲到抓取的数据保存到rawhtml变量中,然后通过编码最终保存到html变量当中,那么html变量还会有什么问题吗?当然会有了,例如可能html变量中的保存的抓取的页面源代码可能有些标签没有关闭标签,例如<div>hello</,这样的错误,那么怎么处理呢?接着看下面的代码: soup=BeautifulSoup(html) 其中利用模块BeautifulSoap,可能很方便去整理html源文件内容,这里我写了个小例子,大家看一下,代码如下: html='<html>&l