原帖: 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
- https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#Browser_compatibility
- https://github.com/zoom/sample-app-web#video-computer-audio-and-sharing-supported-browser
更直接的证据是搜索 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:
-
zoom: check chrome and getDisplayMedia
-
zoom: CHECK_CHROME_SHARING_EXTENSION
-
zoom: send 'WCL.getSourceID' to extension
-
extension: get sourceid
-
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 :)