原帖: https://devforum.zoom.us/t/support-zoom-web-sdk-screen-share-under-chrome-72/4650/2

回复内容:

核心的问题是怎么拿到 MediaStream, 至于拿到 MediaStream 之后用 WebRTC 还是 Zoom 自己的协议, 都是可以的.

不要看插件说明,我们来分析一下源码。

Chrome@72 以上,新增了 getDisplayMedia API.

对比浏览器支持, 可以发现 Zoom web sdk 同样使用了这个 API

更直接的证据是搜索 Zoom web sdk 的源码:

这个 API 的作用是拿到 MediaStream, 直接看例子

document.querySelector('video').srcObject = await navigator.mediaDevices.getDisplayMedia({
  video: true,
  audio: true
});

所以 Zoom 不支持 Chrome@72 以下版本的屏幕分享, 就是因为没有 getDisplayMedia.

那再来看一下插件的源码:

https://gist.github.com/liubiantao/66e06d7203e7ede99b4830e06f911925#file-background-script-js-L20

关键就是 chrome.desktopCapture API

chrome.desktopCapture.chooseDesktopMedia(screenOptions, port.sender.tab, onAccessApproved);

根据 onAccessApproved callback 文档:

streamId: An opaque string that can be passed to getUserMedia() API to generate media stream that corresponds to the source selected by the user. If user didn't select any source (i.e. canceled the prompt) then the callback is called with an empty streamId. The created streamId can be used only once and expires after a few seconds when it is not used. https://developers.chrome.com/extensions/desktopCapture#type-DesktopCaptureSourceType

也就是说 streamId + getUserMedia 可以实现类似 getDisplayMedia 的作用.

到这里我想你们的工程师应该知道怎么做了.

另外, 在 Electron 中, 也可以直接用 desktopCapturer.getSources 拿到 streamId

https://electronjs.org/docs/api/desktop-capturer

所以 Zoom web sdk 是否可以提供一个接口, 允许用户传入 streamId or MediaStream 给你们, 以兼容 Chrome@72 以下浏览器?


I found Zoom Web Client works well in Chrome@61.

Prerequisites: Google Chrome 53.0.2785 or higher https://support.zoom.us/hc/en-us/articles/214629443-Zoom-Web-Client

Then I researched Zoom Scheduler extension https://chrome.google.com/webstore/detail/zoom-scheduler/kgjfgplpablkjnlkjmjdecgdpfankdl

This is exactly what I said yesterday.

Now I know how they work:

  1. zoom: check chrome and getDisplayMedia

  2. zoom: CHECK_CHROME_SHARING_EXTENSION

  3. zoom: send 'WCL.getSourceID' to extension

  4. extension: get sourceid

  5. extension: send 'WCL.sharing' + sourceid to zoom

Next, I need to write an extension to mock step 2-5.

BUT, I would be grateful if you could provide an official interface, thx :)