当前位置:首页 > React

react实现录制视频上传

2026-01-27 13:52:56React

实现视频录制与上传的基本流程

使用React实现视频录制并上传需要结合浏览器提供的媒体API和HTTP上传功能。以下是关键步骤:

获取用户摄像头权限

使用navigator.mediaDevices.getUserMedia获取摄像头访问权限:

react实现录制视频上传

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

创建视频录制组件

使用MediaRecorder API进行录制:

react实现录制视频上传

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

mediaRecorder.ondataavailable = (e) => {
  if (e.data.size > 0) chunks.push(e.data);
};

mediaRecorder.onstop = () => {
  const blob = new Blob(chunks, { type: 'video/webm' });
  setRecordedVideo(URL.createObjectURL(blob));
};

控制录制过程

添加开始/停止录制控制:

const startRecording = () => {
  mediaRecorder.start();
  setIsRecording(true);
};

const stopRecording = () => {
  mediaRecorder.stop();
  setIsRecording(false);
};

上传视频文件

使用FormDatafetch上传视频:

const uploadVideo = async () => {
  const formData = new FormData();
  formData.append('video', blob, 'recording.webm');

  try {
    const response = await fetch('/api/upload', {
      method: 'POST',
      body: formData
    });
    // 处理响应
  } catch (error) {
    // 错误处理
  }
};

完整组件示例

import React, { useState, useRef } from 'react';

function VideoRecorder() {
  const [isRecording, setIsRecording] = useState(false);
  const [recordedVideo, setRecordedVideo] = useState(null);
  const videoRef = useRef();
  const mediaRecorderRef = useRef();
  const streamRef = useRef();
  const chunksRef = useRef([]);

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

      const mediaRecorder = new MediaRecorder(stream);
      mediaRecorderRef.current = mediaRecorder;
      chunksRef.current = [];

      mediaRecorder.ondataavailable = (e) => {
        if (e.data.size > 0) chunksRef.current.push(e.data);
      };

      mediaRecorder.onstop = () => {
        const blob = new Blob(chunksRef.current, { type: 'video/webm' });
        setRecordedVideo(URL.createObjectURL(blob));
      };

      mediaRecorder.start();
      setIsRecording(true);
    } catch (err) {
      console.error('Error accessing media devices:', err);
    }
  };

  const stopRecording = () => {
    mediaRecorderRef.current.stop();
    streamRef.current.getTracks().forEach(track => track.stop());
    setIsRecording(false);
  };

  const uploadVideo = async () => {
    const blob = new Blob(chunksRef.current, { type: 'video/webm' });
    const formData = new FormData();
    formData.append('video', blob, 'recording.webm');

    try {
      const response = await fetch('/api/upload', {
        method: 'POST',
        body: formData
      });
      console.log('Upload successful:', response);
    } catch (error) {
      console.error('Upload failed:', error);
    }
  };

  return (
    <div>
      <video ref={videoRef} autoPlay muted />
      {!isRecording ? (
        <button onClick={startRecording}>Start Recording</button>
      ) : (
        <button onClick={stopRecording}>Stop Recording</button>
      )}
      {recordedVideo && (
        <>
          <video src={recordedVideo} controls />
          <button onClick={uploadVideo}>Upload Video</button>
        </>
      )}
    </div>
  );
}

export default VideoRecorder;

注意事项

  • 确保服务器端有处理文件上传的接口
  • 考虑添加文件大小限制和格式验证
  • 移动设备可能需要额外的权限处理
  • 不同浏览器对视频格式的支持可能不同

标签: 上传视频
分享给朋友:

相关文章

div css制作网页视频

div css制作网页视频

使用DIV和CSS制作网页视频 在网页中嵌入视频可以通过HTML5的<video>标签结合DIV和CSS实现,以下是一种常见的实现方式: 基本HTML结构 创建一个包含视频播放器的DIV…

vue实现视频上传管理

vue实现视频上传管理

视频上传管理实现方案 前端部分(Vue.js) 使用<input type="file">元素配合<video>标签实现基础上传和预览功能: <template>…

vue实现视频

vue实现视频

Vue 实现视频播放功能 Vue 可以通过集成第三方库或直接使用 HTML5 的 <video> 标签来实现视频播放功能。以下是几种常见的方法: 使用 HTML5 <video&g…

jquery视频

jquery视频

以下是关于 jQuery 视频学习资源的整理,涵盖免费教程、实战项目和进阶内容: 免费在线教程 W3School jQuery 教程 提供基础语法、选择器、事件处理等内容的交互式练习,适合快速入门。…

vue webrtc实现视频

vue webrtc实现视频

Vue 与 WebRTC 实现视频通信 WebRTC(Web Real-Time Communication)是一种支持浏览器实时音视频通信的技术。结合 Vue.js 框架,可以快速构建视频通话应用。…

vue实现上传进度

vue实现上传进度

Vue 实现文件上传进度 在 Vue 中实现文件上传进度可以通过 XMLHttpRequest 或 axios 的 onUploadProgress 事件来监听上传进度。以下是两种常见实现方式: 使…