FFMPEG-从媒体记录器API获取ffmpeg过程之前,如何等待所有blob写入完成

问题描述

我正在使用媒体记录器API记录用户屏幕上的视频,并将blob通过Web套接字发送到nodejs服务器。 Node.js服务器正在使用Blob创建一个WebM视频文件,该视频创建良好,但存在延迟,在用户单击“停止记录”按钮后,它停止了媒体记录器api,但是服务器未完成处理所有斑点(至少我认为这是正在发生的事情),然后当我检查生成的视频文件时,记录的最后几秒丢失了,我想知道是否有办法解决这个问题。任何帮助表示赞赏:)

这是将blob发送到nodejs服务器的前端代码

  const startScreenCapture = async () => {
  try {
    let screenStream;
    videoElem = document.getElementById("myscreen");
    screenStream = await navigator.mediaDevices.getdisplayMedia(
      displayMediaOptions
    );

    const recorderOptions = {
      mimeType: "video/webm;codecs=vp9",videoBitsPerSecond: 3 * 1024 * 1024,};

    screenMediaRecorder = new MediaRecorder(screenStream,recorderOptions);
    screenMediaRecorder.start(1); // 1000 - the number of milliseconds to record into each Blob
    screenMediaRecorder.ondataavailable = (event) => {
      console.debug("Got blob data:",event.data);
      console.log("Camera stream: ",event.data);
      if (event.data && event.data.size > 0) {
        socket.emit("screen_stream",event.data);
      }
    };

    videoElem.srcObject = screenStream;
    // console.log("Screen stream",screenStream);
    // socket.emit("screen_stream",screenStream);
  } catch (err) {
    console.error("Error: " + err);
  }
};

const stopCapture = (evt) => {
  let tracks = videoElem.srcObject.getTracks();

  tracks.forEach((track) => track.stop());
  videoElem.srcObject = null;
  screenMediaRecorder.stop();
  socket.emit("stop_screen");
  socket.close();
};

这是处理斑点并生成视频文件的nodejs后端

  const ffmpeg2 = child_process.spawn("ffmpeg",[
    "-i","-","-c:v","copy","-c:a","screen.webm",]);


  socket.on("screen_stream",(msg) => {
    console.log("Writing screen blob! ");
    ffmpeg2.stdin.write(msg);
  });

  socket.on("stop_screen",() => {
    console.log("Stop recording..");
  });

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)