JS PC端调用摄像头录视频截图上传文件

这篇具有很好参考价值的文章主要介绍了JS PC端调用摄像头录视频截图上传文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

创建 Catcher 类

class Catcher {
  URL; // 上传地址
  dataStream; // 流数据
  mediaStream; //媒体流
  mediaRecorder; //录制对象
  state; // 录制状态

  constructor(options) {
    this.video = document.getElementById(options.video);
    this.URL = options.URL;
    this.uploadParams = options.params;
  }

  /**
   * 获取用户媒体设备并处理兼容的问题
   * @param videoEnable {boolean} 是否启用摄像头
   * @param audioEnable {boolean} 是否启用麦克风
   * @param callback {Function} 处理回调
   */
  getMedia(videoEnable, audioEnable, callback) {
    navigator.getMedia =
      navigator.getMedia ||
      navigator.webkitGetUserMedia ||
      navigator.mozGetUserMedia ||
      navigator.msGetUserMedia ||
      window.getMedia;

    const constraints = {
      video: videoEnable,
      audio: audioEnable,
    };

    if (navigator.mediaDevices && navigator.mediaDevices.getMedia) {
      navigator.mediaDevices
        .getMedia(constraints)
        .then(function (stream) {
          callback(false, stream);
        })
        ["catch"](function (err) {
          callback(err);
        });
    } else if (navigator.getMedia) {
      navigator.getMedia(
        constraints,
        function (stream) {
          callback(false, stream);
        },
        function (err) {
          callback(err);
        }
      );
    } else {
      callback(new Error("Not support userMedia"));
    }
  }
  /**
   * 关闭媒体流
   * @param stream {MediaStream} 需要关闭的流
   */
  closeStream(stream) {
    if (typeof stream.stop === "function") {
      stream.stop();
    } else {
      const trackList = [stream.getAudioTracks(), stream.getVideoTracks()];
      for (let i = 0; i < trackList.length; i++) {
        const tracks = trackList[i];
        if (tracks && tracks.length > 0) {
          for (let j = 0; j < tracks.length; j++) {
            let track = tracks[j];
            if (typeof track.stop === "function") {
              track.stop();
            }
          }
        }
      }
    }
  }

  init() {
    if (this.video != null) {
      this.state = false;
      this.getMedia(true, true, (err, stream) => {
        if (err) {
          throw err;
        } else {
          this.mediaRecorder = new MediaRecorder(stream); // 创建 MediaRecorder 实例,记录获取到的媒体流
          this.mediaStream = stream;
          const chunks = [];
          this.video.srcObject = stream;
          this.video.play();
          this.mediaRecorder.ondataavailable = function (e) {
            this.blobs.push(e.data);
            chunks.push(e.data);
          };
          this.mediaRecorder.blobs = [];
          this.mediaRecorder.onstop = (e) => {
            this.dataStream = new Blob(chunks, {
              type: this.mediaRecorder.mimeType,
            });
            chunks = [];
            this.uploadFile(this.dataStream);
          };
        }
      });
    }
  }
  //录制上传服务器
  uploadFile(dataStream) {
    const file = new File(
      [dataStream],
      "msr-" + new Date().toISOString().replace(/:|\./g, "-") + ".mp4",
      {
        type: "video/mp4",
      }
    );
    const url = this.URL;
    if ((url != undefined) & (url != null) & (url != "")) {
      if (confirm("录制完成,是否上传录制文件?")) {
        alert("正在上传录制文件!");
        const formData = new FormData();
        formData.append("file", file);
        const params = this.uploadParams;
        if (
          (params != undefined) &
          (params != null) &
          (typeof params == "object")
        ) {
          for (param in params) {
            formData.append(param, params[params]);
          }
        }
        fetch(url, {
          method: "post",
          headers: { "content-type": "application/x-www-form-urlencoded" },
          body: formData,
        }).then((response) => {
          if (response.status === 200) {
            this.mediaRecorder = null;
            this.mediaStream = null;
            this.dataStream = null;
            alert("上传成功");
          } else {
            alert("上传失败!");
          }
        });
      }
    }
  }
  // 截图并返回图片地址
  screenshot() {
    const canvas = document.createElement("canvas");
    canvas.width = this.video.videoWidth;
    canvas.height = this.video.videoHeight;
    canvas
      .getContext("2d")
      .drawImage(this.video, 0, 0, canvas.width, canvas.height);
    return canvas.toDataURL("image/png");
  }
  // 录制开始
  startRecorder() {
    if ((this.mediaRecorder != undefined) & (this.mediaRecorder != null)) {
      this.state = true;
      this.mediaRecorder.start();
    }
  }
  // 录制结束
  stopRecorder() {
    if ((this.mediaRecorder != undefined) & (this.mediaRecorder != null)) {
      this.state = false;
      this.mediaRecorder.stop();
      this.closeStream(this.mediaStream);
    }
  }
  // 关闭摄像头
  closeMedia() {
    if ((this.mediaStream != undefined) & (this.mediaStream != null)) {
      this.closeStream(this.mediaStream);
    }
  }
}

直接在HTML文件中调用文章来源地址https://www.toymoban.com/news/detail-495668.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>View catch</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }

      .container {
        display: flex;
      }

      #video {
        background: skyblue;
      }

      .operation {
        padding: 20px;
      }

      .operation button {
        display: block;
        margin-bottom: 10px;
      }
    </style>
  </head>

  <body>
    <div class="container">
      <video
        id="video"
        width="500px"
        height="300px"
        autoplay="autoplay"
      ></video>
      <div class="operation">
        <button id="open">开启摄像头</button>
        <button id="recorder">点击录制</button>
        <button id="close">关闭摄像头</button>
        <button id="screenshot">截图</button>
      </div>
    </div>

    <script src="./js/catcher.js"></script>
    <script>
      const catcher = new Catcher({
        video: "video",
        uploadURI: "123",
        params: {},
      });
      const open = document.getElementById("open");
      const screenshot = document.getElementById("screenshot");
      const recorder = document.getElementById("recorder");
      const close = document.getElementById("close");
      open.addEventListener("click", () => {
        catcher.init();
      });
      screenshot.addEventListener("click", () => {
        const src = catcher.screenshot();
        const img = document.createElement("img");
        img.src = src;
        document.getElementsByTagName("body")[0].appendChild(img);
      });
      recorder.addEventListener("click", () => {
        if (catcher.recorderState == false) {
          recorder.innerText = "录制中";
          catcher.startRecorder();
        } else if (catcher.recorderState == true) {
          recorder.innerText = "点击录制";
          catcher.stopRecorder();
        }
      });
      close.addEventListener("click", () => {
        catcher.closeMedia();
      });
    </script>
  </body>
</html>

到了这里,关于JS PC端调用摄像头录视频截图上传文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • H5 页面通过navigator.mediaDevices.getUserMedia调用手机摄像头拍照上传

    需求: 某知名化妆品牌,要做个在线问卷调查。需要试用着自拍上传 注:使用navigator.mediaDevices.getUserMedia 需要使用https请求协议否者视为不安全,无法访问,开发阶段需要将启动改为https 在package.json中 前端开发环境启动项目将http协议改为https协议    授权,默认前置,切换

    2024年02月11日
    浏览(35)
  • yolo v5代码运行图片、调用摄像头、视频

    一、运行 1.视频 修改detect文件219行。 default=ROOT / \\\'data/images/3.mp4\\\' 2.调用摄像头 修改detect文件219行 3.图片 修改detect文件219行。 default=ROOT / \\\'data/images/3.jpg\\\' 二、库 Package Version absl-py 1.3.0 alabaster 0.7.12 applaunchservices 0.2.1 appnope 0.1.2 arrow 1.2.3 astroid 2.11.7 atomicwrites 1.4.0 attrs 22.1.0 autope

    2023年04月17日
    浏览(36)
  • VUE+Django实现前端开启摄像头录制存储视频并直接上传后端

    1.录制前 2.录制中 3.录制结束下载文件至本地 4.视频文件同时上传至后端接口 参考博客https://blog.csdn.net/wuchenlhy/article/details/79311234?spm=1001.2014.3001.5506 博主在后端这块写的十分简洁明了,可以直接参考实现开设后端简单文件上传接口的方法 参考文章: https://blog.csdn.net/XH_jing/a

    2024年02月14日
    浏览(40)
  • uniapp在微信小程序端调用摄像头拍照并且把拍下的图片上传到后端

    需要注意的是我在代码片段中用到 _this,因为我怕函数改变了this的指向所有我在方法的开头就写了 let _this = this

    2024年02月08日
    浏览(43)
  • 树莓派利用python-opencv使用CSI摄像头调用监控视频

    目录 一、安装python-opencv。 二、使用工具Xshell7和MobaXterm 三、连接并打开CSI摄像头 3.1连线如图所示: 3.2打开摄像头 四、编写摄像头代码调用摄像头         一定要选择配置好的安装python-opencv,不要去配置安装,然后还cmake编译,没有必要基本上安装过程都会报2-3个错误,还

    2023年04月17日
    浏览(40)
  • 使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

    1、打开cmd,执行 chcp 65001 ,修改cmd的编码格式为utf8,避免乱码 2、执行指令 ffmpeg -list_devices true -f dshow -i dummy ,查看当前window的音频和视频名称 3、打开windows系统的\\\"打开声音设置\\\"–“麦克风隐私设置”–\\\"允许应用访问你的麦克风\\\"点击开启 录制视频: 录制音频: 录制音视频:

    2024年02月04日
    浏览(39)
  • PyQt界面里如何加载本地视频以及调用摄像头实时检测(小白入门必看)

    目录 1.PyQt介绍 2.代码实现  2.1实时调用摄像头 2.2 使用YOLOv5推理 2.3 代码中用到的主要函数  PyQt是一个用于创建桌面应用程序的Python绑定库,它基于Qt框架。Qt是一个跨平台的C++应用程序开发框架,提供了丰富的图形界面、网络通信、数据库操作等功能。PyQt通过将Qt框架与Py

    2024年02月03日
    浏览(44)
  • WSL2通过OpenCV调用并展示本机摄像头的RTSP视频流

    本篇博客的由来如上图哈哈,WSL2 相关安装教程可以参考我之前的博客:Win11安装WSL2和Nvidia驱动 更多文章欢迎来我的博客小站看呀,会有更多的技术细节~ ubuntu上请执行 或者编译安装 如果报错 Could NOT find OpenSSL ,安装如下依赖即可解决 下载解压 EasyDarwin Easydarwin是国内团队开

    2024年02月09日
    浏览(47)
  • Vue调用摄像头录制视频和音频并上传给后端或下载到本地

    调用摄像头 开始结束录制 对录像时长进行记录 停止录像时终止录制器,关闭媒体流并清除时长记录定时器 回放 下载视频 指定且只能指定,下载后的默认文件名字和文件后缀。注意,可以不指定后缀名,浏览器会根据数据类型自动为其匹配后缀名,但是最好指定后缀。 下载

    2024年02月15日
    浏览(27)
  • Vue实现摄像头视频分屏, 使用flv.js接收rtmp/flv视频流

    1. 现有的平台系统播放实时视频。 因为用户电脑都是Linux系统,无法直接使用海康前端SDK,讨论决定由后台推视频流,简单调研后发现最流行的是flv,而且有B站开源的flv.js适配。前期后台推给我RTMP前缀的视频流,我尝试使用video.js,西瓜视频等都失败了,后来后端改为http前

    2024年02月03日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包