当前位置:首页 > JavaScript

js实现录像

2026-03-14 03:31:19JavaScript

使用MediaDevices API录制视频

在浏览器中实现录像功能可以通过navigator.mediaDevices.getUserMedia获取摄像头权限,结合MediaRecorder API完成录制。以下是基础实现代码:

const startRecording = async () => {
  const stream = await navigator.mediaDevices.getUserMedia({
    video: true,
    audio: true
  });

  const recorder = new MediaRecorder(stream);
  const chunks = [];

  recorder.ondataavailable = (e) => chunks.push(e.data);
  recorder.onstop = () => {
    const blob = new Blob(chunks, { type: 'video/webm' });
    const videoUrl = URL.createObjectURL(blob);
    document.getElementById('preview').src = videoUrl;
  };

  recorder.start();
  setTimeout(() => recorder.stop(), 5000); // 录制5秒
};

处理录制格式与参数

MediaRecorder支持多种格式配置,可通过mimeType指定编码格式。常见配置如下:

const options = {
  mimeType: 'video/webm;codecs=vp9',
  audioBitsPerSecond: 128000,
  videoBitsPerSecond: 2500000
};
const recorder = new MediaRecorder(stream, options);

支持的格式可通过MediaRecorder.isTypeSupported()检测:

js实现录像

if(MediaRecorder.isTypeSupported('video/mp4')) {
  console.log('MP4 supported');
}

实现分段录制与下载

对于长时间录制,建议采用分段存储。以下代码实现分片录制与下载功能:

let mediaRecorder;
let recordedChunks = [];

const handleDataAvailable = (event) => {
  if (event.data.size > 0) {
    recordedChunks.push(event.data);
  }
};

const downloadRecording = () => {
  const blob = new Blob(recordedChunks, {type: 'video/webm'});
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = 'recording.webm';
  a.click();
  URL.revokeObjectURL(url);
};

添加可视化效果

通过Canvas可以实时处理视频帧,添加滤镜或分析功能:

js实现录像

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');

const processFrame = (videoElement) => {
  ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
  const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
  // 对imageData.data进行像素处理
  ctx.putImageData(imageData, 0, 0);
  requestAnimationFrame(() => processFrame(videoElement));
};

跨浏览器兼容方案

不同浏览器对媒体格式支持存在差异,推荐使用适配方案:

const getSupportedMimeType = () => {
  const types = [
    'video/webm;codecs=vp9',
    'video/webm;codecs=vp8',
    'video/webm;codecs=h264',
    'video/mp4;codecs=h264'
  ];
  return types.find(type => MediaRecorder.isTypeSupported(type)) || 'video/webm';
};

错误处理与权限管理

需要处理用户拒绝权限或设备不可用情况:

try {
  const stream = await navigator.mediaDevices.getUserMedia({
    video: { width: 1280, height: 720 },
    audio: true
  });
} catch (err) {
  console.error('Error accessing media devices:', err);
  if (err.name === 'NotAllowedError') {
    alert('Permission denied');
  }
}

扩展功能实现

结合WebSocket可实现实时流传输:

const socket = new WebSocket('ws://example.com/stream');

mediaRecorder.ondataavailable = (event) => {
  if (event.data.size > 0 && socket.readyState === 1) {
    socket.send(event.data);
  }
};

标签: 录像js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…

js图片上传实现

js图片上传实现

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API实现基础图片上传功能。HTML部分需要设置accept="image/…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let currentY…