Project Icon

react-media-recorder

React组件和Hook实现音频、视频及屏幕录制功能

react-media-recorder是一个React组件和Hook库,用于实现音频、视频和屏幕录制功能。它基于MediaRecorder API,提供简洁的接口和自定义UI渲染能力。该库支持TypeScript,便于开发者集成和控制录制过程。适用于在React应用中需要添加媒体录制功能的场景。

react-media-recorder :o2: :video_camera: :microphone: :computer:

react-media-recorder 是一个完全类型化的 React 组件,具有渲染属性或 React hook,可用于:

  • 录制音频/视频
  • 录制屏幕

使用 MediaRecorder API

安装

npm i react-media-recorder

yarn add react-media-recorder

使用方法

import { ReactMediaRecorder } from "react-media-recorder";

const RecordView = () => (
  <div>
    <ReactMediaRecorder
      video
      render={({ status, startRecording, stopRecording, mediaBlobUrl }) => (
        <div>
          <p>{status}</p>
          <button onClick={startRecording}>开始录制</button>
          <button onClick={stopRecording}>停止录制</button>
          <video src={mediaBlobUrl} controls autoPlay loop />
        </div>
      )}
    />
  </div>
);

由于 react-media-recording 使用渲染属性,您可以定义要在视图中渲染的内容。只需记得将 startRecordingstopRecordingmediaBlobUrl 连接到您的组件即可。

使用 React Hooks

import { useReactMediaRecorder } from "react-media-recorder";

const RecordView = () => {
  const { status, startRecording, stopRecording, mediaBlobUrl } =
    useReactMediaRecorder({ video: true });

  return (
    <div>
      <p>{status}</p>
      <button onClick={startRecording}>开始录制</button>
      <button onClick={stopRecording}>停止录制</button>
      <video src={mediaBlobUrl} controls autoPlay loop />
    </div>
  );
};

该 hook 接收一个对象作为参数,该对象具有与 ReactMediaRecorder 相同的选项/属性(除了 render 函数)。

选项 / 属性

audio

可以是布尔值或 MediaTrackConstraints 对象。

类型:booleanobject
默认值:true

blobPropertyBag

来自 MDN
一个可选的 BlobPropertyBag 字典,可以指定以下两个属性(用于 mediaBlob):

  • type,表示将放入 blob 中的数组内容的 MIME 类型。
  • endings,默认值为 "transparent",指定如何写出包含换行符 \n 的字符串。它有两个值之一:"native",表示换行符会更改以匹配主机操作系统文件系统约定,或 "transparent",表示结尾存储在 blob 中时不会更改。

类型:object
默认值:
如果启用了 video

{
   type: "video/mp4"
}

如果只启用了 audio

{
  type: "audio/wav"
}

customMediaStream

媒体流对象本身(可选)

mediaRecorderOptions

一个可选的选项对象,将传递给 MediaRecorder。请注意,如果您通过 audiovideo 属性 通过这个 mediaRecorderOptions 指定 MIME 类型,mediaRecorderOptions 具有更高的优先级。

类型:object
默认值:{}

onStart

当 MediaRecorder 开始时将被调用的 function

类型:function()
默认值:() => null

onStop

当 MediaRecorder 停止时将被调用的 function。它将提供 blob 和 blob URL 作为其参数。

类型:function(blobUrl: string, blob: Blob)
默认值:() => null

stopStreamsOnStop

是否在停止时停止所有流。默认为 true

render

一个 function,接受一个包含字段:statusstartRecordingstopRecordingmediaBlob 的对象。这个函数将返回一个 React 元素/组件。

类型:function
默认值:() => null

screen

一个 boolean 值。允许您录制当前屏幕。并非所有浏览器都支持此功能。请在此处查看可用性。请注意,目前 MediaRecorder 不会同时录制两个相同的流,如果您同时提供 screenvideo 属性,屏幕捕获将优先于视频捕获。但是,您可以提供 video 属性(作为 MediaTrackConstraints),然后它将被屏幕捕获利用(例如,heightwidth 等)。

video

可以是布尔值或 MediaTrackConstraints 对象。

类型:booleanobject
默认值:false

askPermissionOnMount

一个布尔值。如果设置为 true,将在挂载时请求媒体权限。

类型:boolean 默认值:false

render 函数中可用的属性

error

一个字符串枚举。可能的值:

  • media_aborted
  • permission_denied
  • no_specified_media_found
  • media_in_use
  • invalid_media_constraints
  • no_constraints
  • recorder_error

status

一个字符串 enum。可能的值:

  • media_aborted
  • permission_denied
  • no_specified_media_found
  • media_in_use
  • invalid_media_constraints
  • no_constraints
  • recorder_error
  • idle
  • acquiring_media
  • recording
  • stopping
  • stopped

startRecording

一个 function,调用时开始录制。

pauseRecording

一个 function,调用时暂停录制。

resumeRecording

一个 function,调用时恢复录制。

stopRecording

一个 function,调用时停止录制。

muteAudio

一个 function,调用时静音音频轨道。

unmuteAudio

一个 function,调用时取消静音音频轨道。

mediaBlobUrl

一个 blob URL,可以连接到 <audio /><video /><a /> 元素。

clearBlobUrl

一个 function,清除现有生成的 blob URL(如果有)并将工作流重置为初始 idle 状态。

isMuted

一个布尔属性,表示音频是否静音。

previewStream

如果您想为用户创建视频的实时预览,可以使用这个 stream 并将其附加到 <video /> 元素。请注意,这是一个静音流。这是设计如此,以避免笔记本电脑等机器上的内部麦克风反馈。

例如:

const VideoPreview = ({ stream }: { stream: MediaStream | null }) => {
  const videoRef = useRef<HTMLVideoElement>(null);

  useEffect(() => {
    if (videoRef.current && stream) {
      videoRef.current.srcObject = stream;
    }
  }, [stream]);
  if (!stream) {
    return null;
  }
  return <video ref={videoRef} width={500} height={500} autoPlay controls />;
};

const App = () => (
  <ReactMediaRecorder
    video
    render={({ previewStream }) => {
      return <VideoPreview stream={previewStream} />;
    }}
  />
);

previewAudioStream

如果您想访问实时音频流以用于声音可视化,可以使用这个 stream 作为音频源,并使用 Web Audio API 的 AudioContextAnalyzerNode 功能从中提取数据。一些 JavaScript 示例可以在这里找到。

贡献

如果您发现了 bug(我可能遗漏了很多!:grinning:)或想进一步增强它,欢迎提交 PR。

谢谢!祝录制愉快!

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号