Javascript 附加到SourceBuffer的HTML 5视频和音频将变得不同步
我正在使用Media Source Extensions API捕获桌面/应用程序/带有音频的chrome选项卡,并通过Socket.io将数据传输到多个客户端 我使用的是一个MediaRecorder,它通常每10毫秒记录一次流,将每10毫秒的数据块发送到我的服务器,服务器将数据块中继回每个客户端,并附加到一个源缓冲区,该源缓冲区连接到一个视频标签上的MediaSource。音频和视频都通过视频标签成功发送、接收和显示,但是,在短时间后,音频领先于视频,并且两者逐渐分开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
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);
}
}
})
我希望视频和音频在整个播放过程中保持同步,但随着时间的推移,音频会领先于视频。视频有时也会缓冲,这似乎预示着取消同步,但在缓冲音频和视频期间,会停止,然后再次开始。我现在也在做同样的事情,但遇到了问题,你找到解决方案了吗?我现在也在做同样的事情,遇到了问题,你找到了解决方案吗?