瀏覽代碼

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

dev1
virtuacoplenny 8 年之前
父節點
當前提交
fa58b973f0
共有 2 個檔案被更改,包括 47 行新增12 行删除
  1. 42
    11
      modules/RTC/RTCBrowserType.js
  2. 5
    1
      modules/RTC/TraceablePeerConnection.js

+ 42
- 11
modules/RTC/RTCBrowserType.js 查看文件

34
      * strategy or <tt>false</tt> otherwise.
34
      * strategy or <tt>false</tt> otherwise.
35
      */
35
      */
36
     doesVideoMuteByStreamRemove() {
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
         return currentBrowser === RTCBrowserType.RTC_BROWSER_SAFARI;
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
      * Checks if current environment is NWJS.
126
      * Checks if current environment is NWJS.
112
      * @returns {boolean}
127
      * @returns {boolean}
149
         // http://support.temasys.com.sg/support/solutions/articles/
164
         // http://support.temasys.com.sg/support/solutions/articles/
150
         // 5000654345-can-the-temasys-webrtc-plugin-be-used-with-microsoft-edge-
165
         // 5000654345-can-the-temasys-webrtc-plugin-be-used-with-microsoft-edge-
151
         return (
166
         return (
152
-            RTCBrowserType.isSafari()
167
+            (RTCBrowserType.isSafari()
168
+                && !RTCBrowserType.isSafariWithWebrtc())
153
             || (RTCBrowserType.isIExplorer()
169
             || (RTCBrowserType.isIExplorer()
154
                 && RTCBrowserType.getIExplorerVersion() < 12)
170
                 && RTCBrowserType.getIExplorerVersion() < 12)
155
         );
171
         );
165
      */
181
      */
166
     usesNewGumFlow() {
182
     usesNewGumFlow() {
167
         return (RTCBrowserType.isChrome()
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
         return RTCBrowserType.isEdge() ? browserVersion : null;
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
     usesPlanB() {
251
     usesPlanB() {
225
         return !RTCBrowserType.usesUnifiedPlan();
252
         return !RTCBrowserType.usesUnifiedPlan();
226
     },
253
     },
292
      * @returns {boolean}
319
      * @returns {boolean}
293
      */
320
      */
294
     supportsVideo() {
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
 function detectSafari() {
387
 function detectSafari() {
362
     if (/^((?!chrome).)*safari/i.test(navigator.userAgent)) {
388
     if (/^((?!chrome).)*safari/i.test(navigator.userAgent)) {
363
         currentBrowser = RTCBrowserType.RTC_BROWSER_SAFARI;
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
     return null;
401
     return null;

+ 5
- 1
modules/RTC/TraceablePeerConnection.js 查看文件

1776
 
1776
 
1777
     // Safari WebRTC errors when no supported video codec is found in the offer.
1777
     // Safari WebRTC errors when no supported video codec is found in the offer.
1778
     // To prevent the error, inject H264 into the video mLine.
1778
     // To prevent the error, inject H264 into the video mLine.
1779
-    if (RTCBrowserType.usesNewGumFlow() && RTCBrowserType.isSafari()) {
1779
+    if (RTCBrowserType.isSafariWithWebrtc()) {
1780
         logger.debug('Maybe injecting H264 into the remote description');
1780
         logger.debug('Maybe injecting H264 into the remote description');
1781
 
1781
 
1782
         // eslint-disable-next-line no-param-reassign
1782
         // eslint-disable-next-line no-param-reassign
2297
                 // Making sure that getStats won't fail if error callback is
2297
                 // Making sure that getStats won't fail if error callback is
2298
                 // not passed.
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
     } else {
2304
     } else {
2301
         this.peerconnection.getStats(callback);
2305
         this.peerconnection.getStats(callback);
2302
     }
2306
     }

Loading…
取消
儲存