react-media-recorder 是一个完全类型化的 React 组件,具有渲染属性或 React hook,可用于:
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 使用渲染属性,您可以定义要在视图中渲染的内容。只需记得将 startRecording、stopRecording 和 mediaBlobUrl 连接到您的组件即可。
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 函数)。
可以是布尔值或 MediaTrackConstraints 对象。
类型:boolean 或 object
默认值:true
来自 MDN:
一个可选的 BlobPropertyBag 字典,可以指定以下两个属性(用于 mediaBlob):
type,表示将放入 blob 中的数组内容的 MIME 类型。endings,默认值为 "transparent",指定如何写出包含换行符 \n 的字符串。它有两个值之一:"native",表示换行符会更改以匹配主机操作系统文件系统约定,或 "transparent",表示结尾存储在 blob 中时不会更改。类型:object
默认值:
如果启用了 video,
{
type: "video/mp4"
}
如果只启用了 audio,
{
type: "audio/wav"
}
媒体流对象本身(可选)
一个可选的选项对象,将传递给 MediaRecorder。请注意,如果您通过 audio 或 video 属性 和 通过这个 mediaRecorderOptions 指定 MIME 类型,mediaRecorderOptions 具有更高的优先级。
类型:object
默认值:{}
当 MediaRecorder 开始时将被调用的 function。
类型:function()
默认值:() => null
当 MediaRecorder 停止时将被调用的 function。它 将提供 blob 和 blob URL 作为其参数。
类型:function(blobUrl: string, blob: Blob)
默认值:() => null
是否在停止时停止所有流。默认为 true
一个 function,接受一个包含字段:status、startRecording、stopRecording 和 mediaBlob 的对象。这个函数将返回一个 React 元素/组件。
类型:function
默认值:() => null
一个 boolean 值。允许您录制当前屏幕。并非所有浏览器都支持此功能。请在此处查看可用性。请注意,目前 MediaRecorder 不会同时录制两个相同的流,如果您同时提供 screen 和 video 属性,屏幕捕获将优先于视频捕获。但是,您可以提供 video 属性(作为 MediaTrackConstraints),然后它将被屏幕捕获利用(例如,height、width 等)。
可以是布尔值或 MediaTrackConstraints 对象。
类型:boolean 或 object
默认值:false
一个布尔值。如果设置为 true,将在挂载时请求媒体权限。
类型:boolean
默认值:false
render 函数中可用的属性一个字符串枚举。可能的值:
media_abortedpermission_deniedno_specified_media_foundmedia_in_useinvalid_media_constraintsno_constraintsrecorder_error一个字符串 enum。可能的值:
media_abortedpermission_deniedno_specified_media_foundmedia_in_useinvalid_media_constraintsno_constraintsrecorder_erroridleacquiring_mediarecordingstoppingstopped一个 function,调用时开始录制。
一个 function,调用时暂停录制。
一个 function,调用时恢复录制。
一个 function,调用时停止录制。
一个 function,调用时静音音频轨道。
一个 function,调用时取消静音音频轨道。
一个 blob URL,可以连接到 <audio />、<video /> 或 <a /> 元素。
一个 function,清除现有生成的 blob URL(如果有)并将工作流重置为初始 idle 状态。
一个布尔属性,表示音频是否静音。
如果您想为用户创建视频的实时预览,可以使用这个 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} />; }} /> );
如果您想访问实时音频流以用于声音可视化,可以使用这个 stream 作为音频源,并使用 Web Audio API 的 AudioContext 和 AnalyzerNode 功能从中提取数据。一些 JavaScript 示例可以在这里找到。
如果您发现了 bug(我可能遗漏了很多!:grinning:)或想进一步增强它,欢迎提交 PR。
谢谢!祝录制愉快!