Javascript 附加到SourceBuffer的HTML 5视频和音频将变得不同步

Javascript 附加到SourceBuffer的HTML 5视频和音频将变得不同步,javascript,socket.io,synchronization,streaming,media-source,Javascript,Socket.io,Synchronization,Streaming,Media Source,我正在使用Media Source Extensions API捕获桌面/应用程序/带有音频的chrome选项卡,并通过Socket.io将数据传输到多个客户端 我使用的是一个MediaRecorder,它通常每10毫秒记录一次流,将每10毫秒的数据块发送到我的服务器,服务器将数据块中继回每个客户端,并附加到一个源缓冲区,该源缓冲区连接到一个视频标签上的MediaSource。音频和视频都通过视频标签成功发送、接收和显示,但是,在短时间后,音频领先于视频,并且两者逐渐分开 let videoMi

我正在使用Media Source Extensions API捕获桌面/应用程序/带有音频的chrome选项卡,并通过Socket.io将数据传输到多个客户端

我使用的是一个MediaRecorder,它通常每10毫秒记录一次流,将每10毫秒的数据块发送到我的服务器,服务器将数据块中继回每个客户端,并附加到一个源缓冲区,该源缓冲区连接到一个视频标签上的MediaSource。音频和视频都通过视频标签成功发送、接收和显示,但是,在短时间后,音频领先于视频,并且两者逐渐分开

let videoMimeType = 'video/webm;codecs="vp9,opus"';
let player = document.getElementById("player");
let mediaSource = new MediaSource();
player.src = window.URL.createObjectURL(mediaSource);

mediaSource.addEventListener('sourceopen', function(e) {
    if (videoBuffer == null) {
      videoBuffer = mediaSource.addSourceBuffer(videoMimeType);
      videoBuffer.mode = 'sequence'
    }
});

navigator.mediaDevices.getDisplayMedia({
      video: {
        width: {
          max: 1280
        },
        height: {
          max: 720
        },
        frameRate: 30
      },
      audio: {
        echoCancellation: false,
        googEchoCancellation: false,
        googAutoGainControl: false,
        googAutoGainControl2: false,
        googNoiseSuppression: false,
        googHighpassFilter: false
      }
    }).then(
      stream => {
        let videoRecorder = new MediaRecorder(new MediaStream(stream), {
          mimeType: videoMimeType
        });

        stream.getTracks()[0].addEventListener("ended", () => {
          stream.getTracks().forEach(track => track.stop());
          videoRecorder.stop();
          playing = false;
          player.src = "";
          socket.emit("end")
          return;
        });

        videoRecorder.ondataavailable = function(e) {
          if (e.data.size > 0) {
            socket.emit('update', e.data);
          }
        };

        videoRecorder.start(10);

      },
      error => {
        console.log("Unable to acquire screen capture", error);
      });

socket.on("update", (arrayBuffer) => {
  if (playing) {
    player.play()
    if (!videoBuffer.updating && queue.length == 0) {
      videoBuffer.appendBuffer(arrayBuffer);
    }
  }
})


我希望视频和音频在整个播放过程中保持同步,但随着时间的推移,音频会领先于视频。视频有时也会缓冲,这似乎预示着取消同步,但在缓冲音频和视频期间,会停止,然后再次开始。

我现在也在做同样的事情,但遇到了问题,你找到解决方案了吗?我现在也在做同样的事情,遇到了问题,你找到了解决方案吗?