前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >WebRTC网页打开摄像头并录制视频

WebRTC网页打开摄像头并录制视频

作者头像
落寞的鱼丶
发布于 2022-02-26 12:07:54
发布于 2022-02-26 12:07:54
1.6K00
代码可运行
举报
文章被收录于专栏:afjhahfhahajkafjhahfhahajk
运行总次数:0
代码可运行

前面我们能打开本地摄像头,并且在网页上看到摄像头的预览图像。 本文我们使用MediaRecorder来录制视频。在网页上播放录制好的视频,并能提供下载功能。

html#

首先创建一个html界面,放上一些元素

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <video id="v1" playsinline autoplay muted></video>
    <video id="v2" playsinline loop></video>

    <div>
        <button id="startCamera">开启摄像头</button>
        <button id="stopCamera">停止摄像头</button>
        <button id="record" disabled>录制</button>
        <button id="play" disabled>播放</button>
        <button id="download" disabled>下载视频</button>
    </div>
    <div> 录制使用的视频格式: <select id="codecSelect" disabled></select> </div>
    <div>
        <h4>视频设置</h4>
        <p>回声消除: <input type="checkbox" id="echoCancellation"></p>
    </div>
    <div> <span id="msg" style="font-size:smaller"></span> </div>

    <!-- 使用本地的适配器 -->
    <script src="../js/adapter-latest.js" async></script>
  • video
    • v1 用来预览
    • v2 用来播放录制好的视频
  • button 控制摄像头开启、录制,下载等等
  • select 选择录制用的视频格式
  • input 选择回声消除

js#

准备#

先把界面上的元素拿到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'use strict';

let mediaRecorder;
let recordedBlobs; // 录制下来的内容
let isRecording = false;

// 先把页面元素拿到
const startCameraBtn = document.querySelector('button#startCamera'); // 启动摄像头按钮
const stopCameraBtn = document.querySelector('button#stopCamera');
const recordBtn = document.querySelector('button#record'); // 开始录制按钮
const playBtn = document.querySelector('button#play');     // 播放按钮
const downloadBtn = document.querySelector('button#download'); // 下载视频按钮
const codecSelector = document.querySelector('#codecSelect'); // 选择格式
const msgEle = document.querySelector('span#msg');         // 显示消息
const previewV1 = document.querySelector('video#v1'); // 预览用的
const recordedV2 = document.querySelector('video#v2');  // 用来播放录制好的视频

视频支持的格式#

先预定几个可能的格式,然后一个个来判断是否支持。找到支持的格式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getSupportedMimeTypes() {
  const possibleTypes = [
    'video/webm;codecs=vp9,opus',
    'video/webm;codecs=vp8,opus',
    'video/webm;codecs=h264,opus',
    'video/mp4;codecs=h264,aac',
  ];
  return possibleTypes.filter(mimeType => {
    return MediaRecorder.isTypeSupported(mimeType);
  });
}

开启摄像头#

同样要使用getUserMedia方法。这里给视频指定了宽高。回声消除是可选项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 启动摄像头
startCameraBtn.addEventListener('click', async () => {
  startCameraBtn.disabled = true;
  const isEchoCancellation = document.querySelector('#echoCancellation').checked;
  const constraints = {
    audio: {
      echoCancellation: { exact: isEchoCancellation }
    },
    video: {
      width: 1280, height: 720
    }
  };
  await init(constraints);
});

async function init(constraints) {
  try {
    const stream = await navigator.mediaDevices.getUserMedia(constraints);
    gotStream(stream);
  } catch (e) {
    showMsg(`navigator.getUserMedia error:${e.toString()}`);
  }
}

function gotStream(stream) {
  recordBtn.disabled = false;
  showMsg('拿到了 stream:', stream);
  window.stream = stream;
  previewV1.srcObject = stream;

  // 重置
  var codecOption = codecSelector.lastChild;
  while (codecOption != null) {
    codecSelector.removeChild(codecOption);
    codecOption = codecSelector.lastChild;
  }

  getSupportedMimeTypes().forEach(mimeType => {
    const option = document.createElement('option');
    option.value = mimeType;
    option.innerText = option.value;
    codecSelector.appendChild(option);
  });
  codecSelector.disabled = false; // 可以进行选择了
}

下面是停止摄像头的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stopCameraBtn.addEventListener('click', () => {
  var stream = previewV1.srcObject;
  if (stream == null) {
    return;
  }
  const tracks = stream.getTracks();
  tracks.forEach(function (track) {
    track.stop();
  });
  previewV1.srcObject = null;
  window.stream = null;
  codecSelector.disabled = true;
  startCameraBtn.disabled = false;
});

开始录制#

开始录制视频

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function startRecording() {
  recordedBlobs = [];
  const mimeType = codecSelector.options[codecSelector.selectedIndex].value;
  const options = { mimeType };

  try {
    mediaRecorder = new MediaRecorder(window.stream, options);
  } catch (e) {
    showMsg(`创建MediaRecorder出错: ${JSON.stringify(e)}`);
    return;
  }

  showMsg('创建MediaRecorder', mediaRecorder, ' -> options', options);
  recordBtn.textContent = '停止录制';
  isRecording = true;
  playBtn.disabled = true;
  downloadBtn.disabled = true;
  codecSelector.disabled = true;
  mediaRecorder.onstop = (event) => {
    showMsg('录制停止了: ' + event);
    showMsg('录制的数据Blobs: ' + recordedBlobs);
  };
  mediaRecorder.ondataavailable = handleDataAvailable;
  mediaRecorder.start();
  showMsg('录制开始 mediaRecorder: ' + mediaRecorder);
}

function handleDataAvailable(event) {
  if (event.data && event.data.size > 0) {
    recordedBlobs.push(event.data);
  }
}

recordBtn.addEventListener('click', () => {
  if (isRecording == false) {
    startRecording();
  } else {
    stopRecording();
    recordBtn.textContent = '开始录制';
    playBtn.disabled = false;
    downloadBtn.disabled = false;
    codecSelector.disabled = false;
  }
});
  • 重置录制内容recordedBlobs = []
  • 拿到选定的视频格式mimeType
  • 新建MediaRecorder对象,传入前面获取到的流
  • 处理各个按钮(ui)的状态
  • mediaRecorder
    • 设置停止监听器 onstop
    • 监听录制数据 ondataavailable,有数据来的时候存放在recordedBlobs
    • 启动录制 mediaRecorder.start()

停止录制#

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function stopRecording() {
  mediaRecorder.stop();
}

播放录制好的视频#

录制好的视频内容存放在recordedBlobs。新建Blob,交给video(recordedV2)来播放

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
playBtn.addEventListener('click', () => {
  const mimeType = codecSelector.options[codecSelector.selectedIndex].value.split(';', 1)[0];
  const superBuffer = new Blob(recordedBlobs, { type: mimeType });
  recordedV2.src = null;
  recordedV2.srcObject = null;
  recordedV2.src = window.URL.createObjectURL(superBuffer);
  recordedV2.controls = true;
  recordedV2.play();
});

下载视频#

录制好的视频内容存放在recordedBlobs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
downloadBtn.addEventListener('click', () => {
  const blob = new Blob(recordedBlobs, { type: 'video/webm' });
  const url = window.URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.style.display = 'none';
  a.href = url;
  a.download = '视频_' + new Date().getTime() + '.webm';
  document.body.appendChild(a);
  a.click();
  setTimeout(() => {
    document.body.removeChild(a);
    window.URL.revokeObjectURL(url);
  }, 100);
});

新建Blob和一个a元素。根据blob创建ObjectURL,并传给a元素的href。 修改下载文件的默认名字a.download。 触发a元素的click(),即能让浏览器下载这个文件。

延迟把这个a移除掉。

小结#

getUserMedia()开启视频拿到视频流。MediaRecorder录制视频。用Blob来播放和下载。 实现一个小的录制视频效果。视频数据缓存在对象里。

完整的效果请参考 视频录制

原文链接

作者:AnRFDev

出处:https://www.cnblogs.com/rustfisher/p/15637449.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
js实现页面窗口录制
1、在线demo地址:http://www.lb0125.com/videoRecord.html
用户1174387
2023/03/06
40.6K1
js实现页面窗口录制
快速入门 WebRTC:屏幕和摄像头的录制、回放、下载
不知你是否用过 web 版的视频面试,或者 web 版在线会议,它们都支持分享屏幕、也能开启摄像头。这些都是浏览器上实现的,作为前端开发,是否好奇过这些功能的实现原理呢?
神说要有光zxg
2021/12/26
3.1K0
webrtc之摄像头加麦克风实战!
大家周末好,今天给大家继续分享webrtc的文章,在上周分享的文章里面,介绍了如何打开本地摄像头来实时显示采集画面,不过当时代码是用js写的,不知道大家有没有看明白,感兴趣的朋友可以用vs把代码跑起来看看。
用户6280468
2022/03/21
1.8K0
webrtc之摄像头加麦克风实战!
利用WebRTC录制采样的音视频
WebRTC录制音视频流之后,最终是通过Blob对象将数据保存成多媒体文件的,而Blob与ArrayBuffer和ArrayBufferView有着密切的关系。
码农帮派
2021/01/12
1.5K0
Webrtc及WEB端音视频设备获取及流处理
注意本文和之前Electron获取设备的文章有重合,但是也不是一样的,因为在Electron中我们不但能用HTML的API,也能使用Electron的API,但是WEB中就有局限了,在WEB中就实现不了直接分享主屏幕,必须用户选择。
码客说
2022/09/23
2.6K0
Webrtc及WEB端音视频设备获取及流处理
webrtc之STUN、TURN、打开摄像头实战
大家周末好,今天给大家分享的是webrtc第一篇文章,在之前的音视频文章里面没有分享过关于webrtc的内容;在上个周末分享了一篇关于播放器的文章,那篇文章整体上介绍了播放器的设计结构;我个人的学习路线,主要分为两大方向:ffmpeg和webrtc,然后会具体到各种协议。
用户6280468
2022/03/21
2.2K0
webrtc之STUN、TURN、打开摄像头实战
录屏工具开发
https://juejin.cn/post/6915287057795874824
@超人
2021/02/26
2K0
录屏工具开发
js调用网页摄像头进行直播/拍照
具体文档可查看:https://developer.mozilla.org/zh-CN/docs/Web/API/MediaDevices/getUserMedia
仙士可
2022/02/18
5.2K0
js调用网页摄像头进行直播/拍照
WebRTC 之 MediaRecorder_ 用你的浏览器录音和录像
既然现在的笔记本电脑,平板,手机都有摄像头和麦克风,那么录音和录像就是一件非常容易的事情了,但是如果不用别人写好的录音录像程序,让你自己来实现一个录音和录像应用,其实也没那么简单。
前端小tips
2021/11/30
1.9K0
WebRTC 之 MediaRecorder_ 用你的浏览器录音和录像
给测试小妹做了一个js版屏幕录制工具iREC,她用后竟说喜欢我
周末,公司里的测试小妹给我发消息说,她昨晚又加班到很晚,原因是研发要求提复杂bug时需要附上具体的操作流程以便详细了解操作过程和复现。最好能提供一个录制视频,这不是难为我们测试小妹嘛?随后她问我有没有好用,免费的录制屏幕的软件。我答应帮她找找。 看到这里你可能以为这是一篇软件推荐文章,但其实这是一篇造轮子的文章,经过一番搜索,我发现大多数的录屏软件,不是比较笨重,就是有些需要付费,或者无法跨平台使用。于是我想能不能自己开发一个录屏工具,这个想法一旦产生就无法停止,在造轮子之前我需要简单整理一下需求范围,以便挑选合适的工具来实现。
拿我格子衫来
2022/01/24
1.4K0
给测试小妹做了一个js版屏幕录制工具iREC,她用后竟说喜欢我
Web前端WebRTC攻略(二) 音视频设备及数据采集
2021年1月26日,W3C 和 IETF 同时宣布 WebRTC(Web Real-Time Communications,Web 实时通信)现发布为正式标准,标志着 WebRTC正式走进舞台。尽管如此,WebRTC 早已在视频会议和直播中得到了广泛的应用,成为了线上通信及协作服务的基石。IMWeb 团队是国内最早研究 WebRTC 的团队之一,在腾讯课堂、企鹅辅导等应用中都有实践。这是 WebRTC 系列的第二篇,希望可以帮助你更好的了解音视频。 一、音视频采集基本概念 在讲浏览器提供的用 JS 采集音
用户1097444
2022/06/29
3.6K0
Web前端WebRTC攻略(二) 音视频设备及数据采集
Electron音视频录制
获取设备的支持情况 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(types[i] + ":" + (MediaRecorder.isT
码客说
2019/10/21
4K1
WebRTC简介及使用
WebRTC 只是一个媒体引擎,上面有一个 JavaScript API,所以每个人都知道如何使用它(尽管浏览器实现仍然各不相同),本文对 WebRTC(网页实时通信)的相关内容进行简要介绍。
Gnep@97
2023/11/12
2.2K0
WebRTC简介及使用
炸裂,用JS创建一个录屏功能
OBS studio很酷,但 JavaScript 更酷,现在,我们用 JavaScript 创建自己的录屏功能。
前端小智@大迁世界
2022/06/15
1.2K0
炸裂,用JS创建一个录屏功能
探秘移动端网页调用摄像头的两种方式
PC 端网页调用摄像头的场景想必大家并不陌生,打开一个网址,开启摄像头开始笔试/视频聊天/直播等。
掘金安东尼
2022/09/22
4.5K0
探秘移动端网页调用摄像头的两种方式
利用WebRTC给自己拍照
播放音频文件的时候,播放的其实是一幅幅图像数据,在播放器播放某个音频文件的时候,会按照一定的时间间隔从视频文件中读取解码后的视频帧,这样视频就动了起来。播放从摄像头中获取的视频帧也是如此,只不过从摄像头中获取到的本来就是非编码帧,无需解码。
码农帮派
2021/01/12
8890
利用WebRTC给自己拍照
神奇canvas 带你实现魔法摄像头
我们用手机的摄像头自拍,很容易实现 简单的自拍效果,如复古、黑白等等。其实我们使用web端的JavaScript也是可以实现的。接下来就带领小伙伴实现一个魔法摄像头。并且提供了截图下载功能。
万少
2025/02/10
850
神奇canvas 带你实现魔法摄像头
使用h5新标准MediaRecorder API在web页面进行音视频录制
Media Recorder,顾名思义是控制媒体录制的api,在原生app开发中,是一个应用广泛的api,用于在app内录制音频和视频。
WendyGrandOrder
2018/11/26
22.7K11
使用h5新标准MediaRecorder API在web页面进行音视频录制
WebRTC实战教程:如何录制视频和播放
Tinywan
2024/03/11
4120
WebRTC实战教程:如何录制视频和播放
Html5调用手机摄像头并实现人脸识别的实现
这是一种基于HTML5的简单示例,展示如何使用JavaScript来调用手机摄像头并实现人脸识别。
七条猫
2024/10/14
4560
Html5调用手机摄像头并实现人脸识别的实现
相关推荐
js实现页面窗口录制
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验