当前位置:首页 > 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;

注意事项

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

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

相关文章

h5怎么实现上传视频

h5怎么实现上传视频

使用HTML5实现视频上传 HTML5提供了<input type="file">元素用于文件上传,结合<video>标签可以实现视频上传和预览功能。 <input t…

Vue实现视频截图

Vue实现视频截图

Vue实现视频截图的步骤 在Vue中实现视频截图功能,可以通过HTML5的<video>元素和Canvas API来完成。以下是具体实现方法: 创建视频元素和Canvas 在Vue组件的…

vue实现拖拽上传

vue实现拖拽上传

Vue 拖拽上传实现方法 使用 HTML5 原生拖拽 API 在 Vue 中可以通过监听原生拖拽事件实现基础功能: <template> <div class="dr…

vue实现语音上传

vue实现语音上传

实现语音上传功能 在Vue中实现语音上传功能需要结合浏览器的Web Audio API和文件上传逻辑。以下是一个完整的实现方案: 录音功能实现 安装依赖库recorder-core和wav编码器:…

vue实现上传按钮

vue实现上传按钮

Vue 实现上传按钮的方法 使用原生 HTML input 和 Vue 处理 通过 HTML 的 input 元素结合 Vue 的事件处理实现文件上传功能。 <template> &…

vue实现附件上传

vue实现附件上传

文件上传的基本实现 在Vue中实现文件上传可以通过原生HTML的<input type="file">元素结合Vue的数据绑定和事件处理来完成。创建一个文件上传组件,监听change事件获…