Ver código fonte

feat(adapter): enable audio-only webrtc safari for >= 11 (#639)

dev1
virtuacoplenny 8 anos atrás
pai
commit
fa58b973f0
2 arquivos alterados com 47 adições e 12 exclusões
  1. 42
    11
      modules/RTC/RTCBrowserType.js
  2. 5
    1
      modules/RTC/TraceablePeerConnection.js

+ 42
- 11
modules/RTC/RTCBrowserType.js Ver arquivo

@@ -34,7 +34,11 @@ const RTCBrowserType = {
34 34
      * strategy or <tt>false</tt> otherwise.
35 35
      */
36 36
     doesVideoMuteByStreamRemove() {
37
-        return !(RTCBrowserType.isFirefox() || RTCBrowserType.isEdge());
37
+        return !(
38
+            RTCBrowserType.isFirefox()
39
+            || RTCBrowserType.isEdge()
40
+            || RTCBrowserType.isSafariWithWebrtc()
41
+        );
38 42
     },
39 43
 
40 44
     /**
@@ -107,6 +111,17 @@ const RTCBrowserType = {
107 111
         return currentBrowser === RTCBrowserType.RTC_BROWSER_SAFARI;
108 112
     },
109 113
 
114
+    /**
115
+     * Checks if current browser is a Safari and a version of Safari that
116
+     * supports native webrtc.
117
+     *
118
+     * @returns {boolean}
119
+     */
120
+    isSafariWithWebrtc() {
121
+        return RTCBrowserType.isSafari()
122
+            && RTCBrowserType.getSafariVersion() >= 11;
123
+    },
124
+
110 125
     /**
111 126
      * Checks if current environment is NWJS.
112 127
      * @returns {boolean}
@@ -149,7 +164,8 @@ const RTCBrowserType = {
149 164
         // http://support.temasys.com.sg/support/solutions/articles/
150 165
         // 5000654345-can-the-temasys-webrtc-plugin-be-used-with-microsoft-edge-
151 166
         return (
152
-            RTCBrowserType.isSafari()
167
+            (RTCBrowserType.isSafari()
168
+                && !RTCBrowserType.isSafariWithWebrtc())
153 169
             || (RTCBrowserType.isIExplorer()
154 170
                 && RTCBrowserType.getIExplorerVersion() < 12)
155 171
         );
@@ -165,8 +181,10 @@ const RTCBrowserType = {
165 181
      */
166 182
     usesNewGumFlow() {
167 183
         return (RTCBrowserType.isChrome()
168
-            && RTCBrowserType.getChromeVersion() >= 61)
169
-            || RTCBrowserType.isFirefox();
184
+                && RTCBrowserType.getChromeVersion() >= 61)
185
+            || RTCBrowserType.isFirefox()
186
+            || RTCBrowserType.isSafariWithWebrtc();
187
+
170 188
     },
171 189
 
172 190
     /**
@@ -221,6 +239,15 @@ const RTCBrowserType = {
221 239
         return RTCBrowserType.isEdge() ? browserVersion : null;
222 240
     },
223 241
 
242
+    /**
243
+     * Returns Safari version.
244
+     *
245
+     * @returns {number|null}
246
+     */
247
+    getSafariVersion() {
248
+        return RTCBrowserType.isSafari ? browserVersion : null;
249
+    },
250
+
224 251
     usesPlanB() {
225 252
         return !RTCBrowserType.usesUnifiedPlan();
226 253
     },
@@ -292,11 +319,10 @@ const RTCBrowserType = {
292 319
      * @returns {boolean}
293 320
      */
294 321
     supportsVideo() {
295
-        // Currently all browsers are assumed to support video.
296
-        return true;
322
+        // Currently Safari using webrtc/adapter does not support video due in
323
+        // part to Safari only supporting H264 and the bridge sending VP8.
324
+        return !RTCBrowserType.isSafariWithWebrtc();
297 325
     }
298
-
299
-    // Add version getters for other browsers when needed
300 326
 };
301 327
 
302 328
 /**
@@ -361,10 +387,15 @@ function detectFirefox() {
361 387
 function detectSafari() {
362 388
     if (/^((?!chrome).)*safari/i.test(navigator.userAgent)) {
363 389
         currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI;
364
-        logger.info('This appears to be Safari');
365 390
 
366
-        // FIXME detect Safari version when needed
367
-        return 1;
391
+        const matchedVersionParts
392
+            = navigator.userAgent.match(/version\/(\d+(\.\d+)?)/i);
393
+        const versionString = matchedVersionParts && matchedVersionParts[1];
394
+        const version = versionString ? parseInt(versionString, 10) : -1;
395
+
396
+        logger.info(`This appears to be Safari, ver: ${version}`);
397
+
398
+        return version;
368 399
     }
369 400
 
370 401
     return null;

+ 5
- 1
modules/RTC/TraceablePeerConnection.js Ver arquivo

@@ -1776,7 +1776,7 @@ TraceablePeerConnection.prototype.setRemoteDescription = function(
1776 1776
 
1777 1777
     // Safari WebRTC errors when no supported video codec is found in the offer.
1778 1778
     // To prevent the error, inject H264 into the video mLine.
1779
-    if (RTCBrowserType.usesNewGumFlow() && RTCBrowserType.isSafari()) {
1779
+    if (RTCBrowserType.isSafariWithWebrtc()) {
1780 1780
         logger.debug('Maybe injecting H264 into the remote description');
1781 1781
 
1782 1782
         // eslint-disable-next-line no-param-reassign
@@ -2297,6 +2297,10 @@ TraceablePeerConnection.prototype.getStats = function(callback, errback) {
2297 2297
                 // Making sure that getStats won't fail if error callback is
2298 2298
                 // not passed.
2299 2299
             }));
2300
+    } else if (RTCBrowserType.isSafariWithWebrtc()) {
2301
+        // FIXME: Safari's native stats implementation is not compatibile with
2302
+        // existing stats processing logic. Skip implementing stats for now to
2303
+        // at least get native webrtc Safari available for use.
2300 2304
     } else {
2301 2305
         this.peerconnection.getStats(callback);
2302 2306
     }

Carregando…
Cancelar
Salvar