Agora SDK 怎么获取音视频流的原生流对象?

现在有一个需求要将多人视频录制下来,录制功能要用WebRTC的MediaRecorder API实现,直接localStream.stream出来的是原生的流对象吗?但是我new MediaRecorder(localStream.stream)得到的recorder好像不能实现录制

代码实现大概是这样:

  const [chunks, setChunks] = useState<any[]>([]);

  const recording = () => {
    if (!navigator.mediaDevices) {
      message.success('Current browser does not support!');
      return
    }
    setIsRecording(true);
    //@ts-ignore
    const localRecorder = new MediaRecorder(localStream.stream);
    localRecorder.ondataavailable = (e: any) => {
      setChunks(old => [...old, e.data])
    };
    localRecorder.onstop = (e: any) => {
      console.log(chunks);
      const blob = new Blob(chunks, { 'type': 'video/mp4;' });
      setVideoURL(URL.createObjectURL(blob));
      setChunks([]);
    }
    setLocalRecorder(localRecorder);
    localRecorder.start();
  };

  const stopRecording = () => {
    if (localRecorder) {
      localRecorder.stop();
    }
  };

ondataavailable一直不触发,chunks一直是一个空数组;
有用过的阔以提供一下思路吗?谢谢!

需要不断地去获取数据

上面的问题已经解决了,直接在本地流对象localStream.stream就能拿到原生流对象,上面的问题出在start()的时候要传一个毫秒值分割一下,这样才会在每一个分割时间时触发ondataavailable,不然的话就只有stop()的时候触发,拿到一个整的,这样不好。

现在的问题是,远端流的录制,也是要向new MediaRecorder传入一个远端流的对象的,我把这个写在了"stream-added"回调里,代码大致长这个样子:

const doSub = (evt: any) => {
if (!mounted) {
return;
}
client.subscribe(evt.stream);
// @ts-ignore
const remoteRecorder = new MediaRecorder(evt.stream.stream);
remoteRecorder.ondataavailable = (e: any) => {
remoteChunksRef.current = […remoteChunksRef.current, e.data];
};
remoteRecorder.onstop = (e: any) => {
const blob = new Blob(remoteChunksRef.current, { ‘type’: ‘video/mp4;’ });
setRemoteURL(URL.createObjectURL(blob));
}
setRemoteRecorder(remoteRecorder);
remoteRecorder.start(100);
console.log(evt.stream)
};
client.on(“stream-added”, doSub);

代码报错说evt.stream.stream不是 MediaStream类型,我打印出来是undefined,
但是我打印evt.stream是看得到一个stream属性的,不是undefined:

现在的问题是拿不到远端原生流对象,又实现不了远端流录制了
我太难了
有好心的过来人阔以搭把手么

对不起我写错回调了,应该写到"stream-subscribed"里面去,我错了!emmmm打扰了,

1赞