WebRTC 的黎明
The Dawn of WebRTC 機翻
原文:The Dawn of WebRTC - SitePoint
Web 實時通信 (WebRTC) 旨在為開發人員提供使用簡單 JavaScript API 創建高清視頻和音頻呼叫的能力。這些 API 直接嵌入在瀏覽器中,無需插件、下載或任何類型的安裝即可啟動和運行。
谷歌花了大約 2 億美元將這項技術開源給開發社區。WebRTC 使用多種視頻和音頻編解碼器,使任何人都能夠創建下一代通信應用程序,而無需支付許可或版稅。
有哪些可能性?
我們才剛剛開始了解 WebRTC 將如何改變通信行業。我們正在看到使用 WebRTC 創建的所有類型的應用程序。最具標志性的例子之一是亞馬遜的 Mayday Button。它展示了大大小小的公司如何利用 WebRTC 的真正力量。
WebRTC 為您帶來了許多功能來增強您的應用程序,例如:
- 視頻通信:在瀏覽器之間創建安全和高清的音頻和視頻流
- 文件共享和消息傳遞:在瀏覽器之間安全地連接和共享數據,無需將文件上傳到云或網絡服務器。數據直接在連接的對等點之間發送
- 電話到瀏覽器:?WebRTC 允許公共交換電話網絡 (PSTN) 和瀏覽器之間的連接。您可以使用 HTML5 中的新 API、SIP 網關和 WebRTC 從一個位置撥打和接聽電話
- 移動到移動:?WebRTC 不僅適用于 Web,還有適用于 iOS 和 Android 的原生庫利用 WebRTC 的功能
- 機器對機器:?WebRTC 可嵌入到需要機器對機器通信的系統中,例如物聯網。Google Chromecast 是在正常用例之外使用 WebRTC 的完美示例
了解 WebRTC API
WebRTC 依賴于三個直接嵌入到 Web 瀏覽器中的 JavaScript API,無需客戶端或瀏覽器插件即可與另一個啟用 WebRTC 的瀏覽器直接通信。這些 API 是:
- MediaStream(又名 getUserMedia)允許您訪問用戶使用的設備的攝像頭、麥克風或屏幕。作為附加的安全層,在您被允許流式傳輸他們的媒體之前,用戶將擁有訪問權限。如果用戶從安全連接 (HTTPS) 連接,則用戶只需為應用程序授予一次訪問權限,但如果您從非安全連接 (HTTP) 連接,則每次應用程序需要訪問權限時都會提示用戶
- RTCPeerConnection(又名 PeerConnection)允許兩個用戶直接通信,點對點。它對發送到本地計算機和從本地計算機發送到接收媒體的遠程對等體的媒體進行編碼和解碼。
- RTCDataChannel (aka DataChannel) 代表兩個對等點之間的雙向數據通道。它搭載在 RTCPeerConnection 之上,允許您直接在兩個連接的對等方之間安全地發送數據。
WebRTC 入門
我們將從一個簡單的照相亭應用程序開始,它允許您使用網絡攝像頭捕獲圖像并將一些 CSS 過濾器應用于捕獲的圖像。它將教您使用 MediaStream API 開始使用 WebRTC 的基礎知識。它是Google 團隊創建的示例應用程序的輕微修改版本
HTML
在下面的 HTML 代碼中,您將看到創建您的第一個 WebRTC Web 應用程序所需的基礎知識。WebRTC 利用 HTML5 `video` 元素來呈現本地和遠程視頻流。此外,我們將使用 `canvas` 元素制作本地視頻流的快照以應用過濾器:
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-markup"><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"><</span>div</span> <span style="color:#ffcb6b">class</span><span style="color:#ff5572"><span style="color:#c792ea">=</span><span style="color:#c792ea">"</span>m-content<span style="color:#c792ea">"</span></span><span style="color:#c792ea">></span></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"><</span>h1</span><span style="color:#c792ea">></span></span>getUserMedia + CSS filters demo<span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"></</span>h1</span><span style="color:#c792ea">></span></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"><</span>div</span> <span style="color:#ffcb6b">class</span><span style="color:#ff5572"><span style="color:#c792ea">=</span><span style="color:#c792ea">"</span>photo-booth<span style="color:#c792ea">"</span></span><span style="color:#c792ea">></span></span><span style="color:#697098"><!-- local video stream will be rendered to the video tag --></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"><</span>video</span> <span style="color:#ffcb6b">autoplay</span><span style="color:#c792ea">></span></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"></</span>video</span><span style="color:#c792ea">></span></span><span style="color:#697098"><!-- a copy of the stream will be made and css filters applied --></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"><</span>canvas</span><span style="color:#c792ea">></span></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"></</span>canvas</span><span style="color:#c792ea">></span></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"></</span>div</span><span style="color:#c792ea">></span></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"><</span>div</span> <span style="color:#ffcb6b">class</span><span style="color:#ff5572"><span style="color:#c792ea">=</span><span style="color:#c792ea">"</span>buttons<span style="color:#c792ea">"</span></span><span style="color:#c792ea">></span></span><span style="color:#697098"><!-- call getUserMedia() to access webcam and give permission --></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"><</span>button</span> <span style="color:#ffcb6b">id</span><span style="color:#ff5572"><span style="color:#c792ea">=</span><span style="color:#c792ea">"</span>start<span style="color:#c792ea">"</span></span><span style="color:#c792ea">></span></span>Access Webcam<span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"></</span>button</span><span style="color:#c792ea">></span></span><span style="color:#697098"><!-- take a snapshot from your webcam and render it to the canvas tag --></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"><</span>button</span> <span style="color:#ffcb6b">id</span><span style="color:#ff5572"><span style="color:#c792ea">=</span><span style="color:#c792ea">"</span>snapshot<span style="color:#c792ea">"</span></span><span style="color:#c792ea">></span></span>Take a Snapshot<span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"></</span>button</span><span style="color:#c792ea">></span></span><span style="color:#697098"><!-- sort through the available css filters --></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"><</span>button</span> <span style="color:#ffcb6b">id</span><span style="color:#ff5572"><span style="color:#c792ea">=</span><span style="color:#c792ea">"</span>filter<span style="color:#c792ea">"</span></span><span style="color:#c792ea">></span></span>Change Filter<span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"></</span>button</span><span style="color:#c792ea">></span></span><span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"></</span>div</span><span style="color:#c792ea">></span></span> <span style="color:#ff5572"><span style="color:#ff5572"><span style="color:#c792ea"></</span>div</span><span style="color:#c792ea">></span></span></code></span></span>JavaScript
該navigator.getUserMedia()方法是 getUserMedia API 提供的方法,它允許您從用戶那里檢索流。在撰寫本文時,需要為不同的供應商前綴定義它,以使該應用程序在所有 WebRTC 兼容瀏覽器上工作:Chrome、Firefox、Opera。我們可以通過以下代碼實現這個目標:
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-javascript"><span style="color:#bfc7d5">navigator</span><span style="color:#c792ea">.</span>getUserMedia <span style="color:#89ddff">=</span> <span style="color:#bfc7d5">navigator</span><span style="color:#c792ea">.</span>getUserMedia <span style="color:#89ddff">||</span><span style="color:#bfc7d5">navigator</span><span style="color:#c792ea">.</span>webkitGetUserMedia <span style="color:#89ddff">||</span><span style="color:#bfc7d5">navigator</span><span style="color:#c792ea">.</span>mozGetUserMedia<span style="color:#c792ea">;</span></code></span></span>我們需要定義我們請求的約束,這些約束navigator.getUserMedia()將決定我們請求的媒體類型。在此示例中,我們僅通過設置請求訪問用戶的網絡攝像頭video: true。
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-javascript">var constraints <span style="color:#89ddff">=</span> <span style="color:#c792ea">{</span> audio<span style="color:#89ddff">:</span> <span style="color:#ff5874">false</span><span style="color:#c792ea">,</span> video<span style="color:#89ddff">:</span> <span style="color:#ff5874">true</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">;</span></code></span></span>下面我們在變量中定義和存儲演示應用程序的 HTML 元素。
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-javascript">var start <span style="color:#89ddff">=</span> <span style="color:#bfc7d5">document</span><span style="color:#c792ea">.</span><span style="color:#82aaff">querySelector</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'#start'</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> var snapshot <span style="color:#89ddff">=</span> <span style="color:#bfc7d5">document</span><span style="color:#c792ea">.</span><span style="color:#82aaff">querySelector</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'#snapshot'</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> var filter <span style="color:#89ddff">=</span> <span style="color:#bfc7d5">document</span><span style="color:#c792ea">.</span><span style="color:#82aaff">querySelector</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'#filter'</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> var video <span style="color:#89ddff">=</span> <span style="color:#bfc7d5">document</span><span style="color:#c792ea">.</span><span style="color:#82aaff">querySelector</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'video'</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> var canvas <span style="color:#89ddff">=</span> <span style="color:#bfc7d5">document</span><span style="color:#c792ea">.</span><span style="color:#82aaff">querySelector</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'canvas'</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span></code></span></span>接下來,我們需要為我們將應用于快照的過濾器創建一個數組。我們將在我們的 CSS 代碼中定義過濾器,在下一節中描述,使用相同的名稱:
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-javascript">var filters <span style="color:#89ddff">=</span> <span style="color:#c792ea">[</span><span style="color:#c3e88d">'blur'</span><span style="color:#c792ea">,</span> <span style="color:#c3e88d">'brightness'</span><span style="color:#c792ea">,</span> <span style="color:#c3e88d">'contrast'</span><span style="color:#c792ea">,</span> <span style="color:#c3e88d">'grayscale'</span><span style="color:#c792ea">,</span><span style="color:#c3e88d">'hue'</span><span style="color:#c792ea">,</span> <span style="color:#c3e88d">'invert'</span><span style="color:#c792ea">,</span> <span style="color:#c3e88d">'saturate'</span><span style="color:#c792ea">,</span> <span style="color:#c3e88d">'sepia'</span><span style="color:#c792ea">]</span><span style="color:#c792ea">;</span></code></span></span>是時候享受真正的樂趣了!我們向我們的開始按鈕添加一個click事件來初始化?navigator.getUserMedia(constraints, success, error);以訪問我們的網絡攝像頭。必須獲得許可才能訪問我們的網絡攝像頭。每個瀏覽器供應商處理顯示提示以允許以不同方式訪問用戶的網絡攝像頭和麥克風。
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-javascript">start<span style="color:#c792ea">.</span><span style="color:#82aaff">addEventListener</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'click'</span><span style="color:#c792ea">,</span> function<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span> <span style="color:#c792ea">{</span><span style="color:#bfc7d5">navigator</span><span style="color:#c792ea">.</span><span style="color:#82aaff">getUserMedia</span><span style="color:#c792ea">(</span>constraints<span style="color:#c792ea">,</span> success<span style="color:#c792ea">,</span> error<span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span></code></span></span>在成功授予訪問用戶網絡攝像頭的權限后,我們將流對象作為 HTML5video標記的源傳遞。
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-javascript">function <span style="color:#82aaff">success</span><span style="color:#c792ea">(</span>stream<span style="color:#c792ea">)</span> <span style="color:#c792ea">{</span><span style="color:#697098">/* hide the start button*/</span>start<span style="color:#c792ea">.</span>style<span style="color:#c792ea">.</span>display <span style="color:#89ddff">=</span> <span style="color:#c3e88d">'none'</span><span style="color:#c792ea">;</span><span style="color:#697098">/* show the snapshot button*/</span>snapshot<span style="color:#c792ea">.</span>style<span style="color:#c792ea">.</span>display <span style="color:#89ddff">=</span> <span style="color:#c3e88d">'block'</span><span style="color:#c792ea">;</span><span style="color:#697098">/* show the filter button*/</span>filter<span style="color:#c792ea">.</span>style<span style="color:#c792ea">.</span>display <span style="color:#89ddff">=</span> <span style="color:#c3e88d">'block'</span><span style="color:#c792ea">;</span>if<span style="color:#c792ea">(</span><span style="color:#bfc7d5">window</span><span style="color:#c792ea">.</span><span style="color:#82aaff">URL</span><span style="color:#c792ea">)</span> <span style="color:#c792ea">{</span>video<span style="color:#c792ea">.</span>src <span style="color:#89ddff">=</span> <span style="color:#bfc7d5">window</span><span style="color:#c792ea">.</span><span style="color:#82aaff">URL</span><span style="color:#c792ea">.</span><span style="color:#82aaff">createObjectURL</span><span style="color:#c792ea">(</span>stream<span style="color:#c792ea">)</span><span style="color:#c792ea">;</span><span style="color:#c792ea">}</span> else <span style="color:#c792ea">{</span>video<span style="color:#c792ea">.</span>src <span style="color:#89ddff">=</span> stream<span style="color:#c792ea">;</span><span style="color:#c792ea">}</span> <span style="color:#c792ea">}</span></code></span></span>如果訪問用戶的網絡攝像頭發生錯誤或權限被拒絕,您將收到將打印到控制臺的錯誤。
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-javascript">function <span style="color:#82aaff">error</span><span style="color:#c792ea">(</span>e<span style="color:#c792ea">)</span> <span style="color:#c792ea">{</span><span style="color:#ffcb6b">console</span><span style="color:#c792ea">.</span><span style="color:#82aaff">log</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'navigator.getUserMedia error: '</span><span style="color:#c792ea">,</span> e<span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span></code></span></span>接下來我們創建一個簡單的函數來將我們的 CSS 過濾器應用于canvas和video元素。該函數將找到 CSS 類的名稱并將過濾器應用于畫布。
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-javascript">filter<span style="color:#c792ea">.</span><span style="color:#82aaff">addEventListener</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'click'</span><span style="color:#c792ea">,</span> function<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span> <span style="color:#c792ea">{</span> var index <span style="color:#89ddff">=</span> <span style="color:#c792ea">(</span>filters<span style="color:#c792ea">.</span><span style="color:#82aaff">indexOf</span><span style="color:#c792ea">(</span>canvas<span style="color:#c792ea">.</span>className<span style="color:#c792ea">)</span> <span style="color:#89ddff">+</span> <span style="color:#f78c6c">1</span><span style="color:#c792ea">)</span> <span style="color:#89ddff">%</span> filters<span style="color:#c792ea">.</span>length<span style="color:#c792ea">;</span>video<span style="color:#c792ea">.</span>className <span style="color:#89ddff">=</span> filters<span style="color:#c792ea">[</span>index<span style="color:#c792ea">]</span><span style="color:#c792ea">;</span>canvas<span style="color:#c792ea">.</span>className <span style="color:#89ddff">=</span> filters<span style="color:#c792ea">[</span>index<span style="color:#c792ea">]</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span></code></span></span>最后,我們拍攝本地視頻流的快照并將其渲染到canvas.
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-javascript">snapshot<span style="color:#c792ea">.</span><span style="color:#82aaff">addEventListener</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'click'</span><span style="color:#c792ea">,</span> function<span style="color:#c792ea">(</span><span style="color:#c792ea">)</span> <span style="color:#c792ea">{</span>canvas<span style="color:#c792ea">.</span>width <span style="color:#89ddff">=</span> <span style="color:#f78c6c">360</span><span style="color:#c792ea">;</span>canvas<span style="color:#c792ea">.</span>height <span style="color:#89ddff">=</span> <span style="color:#f78c6c">270</span><span style="color:#c792ea">;</span>canvas<span style="color:#c792ea">.</span><span style="color:#82aaff">getContext</span><span style="color:#c792ea">(</span><span style="color:#c3e88d">'2d'</span><span style="color:#c792ea">)</span><span style="color:#c792ea">.</span><span style="color:#82aaff">drawImage</span><span style="color:#c792ea">(</span>video<span style="color:#c792ea">,</span> <span style="color:#f78c6c">0</span><span style="color:#c792ea">,</span> <span style="color:#f78c6c">0</span><span style="color:#c792ea">,</span> canvas<span style="color:#c792ea">.</span>width<span style="color:#c792ea">,</span> canvas<span style="color:#c792ea">.</span>height<span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span></code></span></span>CSS
您將在下面找到為您的第一個 WebRTC 應用程序設置樣式的基礎知識。
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-css"><span style="color:#c792ea">body</span> <span style="color:#c792ea">{</span>font-family<span style="color:#c792ea">:</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">'Open Sans'</span></span><span style="color:#c792ea">,</span> sans-serif<span style="color:#c792ea">;</span>background-color<span style="color:#c792ea">:</span> #e4e4e4<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">h1</span> <span style="color:#c792ea">{</span>width<span style="color:#c792ea">:</span> <span style="color:#f78c6c">780</span>px<span style="color:#c792ea">;</span>margin-left<span style="color:#c792ea">:</span> <span style="color:#f78c6c">20</span>px<span style="color:#c792ea">;</span>float<span style="color:#c792ea">:</span> left<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">.m-content</span> <span style="color:#c792ea">{</span>width<span style="color:#c792ea">:</span> <span style="color:#f78c6c">800</span>px<span style="color:#c792ea">;</span>height<span style="color:#c792ea">:</span> <span style="color:#f78c6c">310</span>px<span style="color:#c792ea">;</span>margin<span style="color:#c792ea">:</span> auto<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">.photo-booth</span> <span style="color:#c792ea">{</span>width<span style="color:#c792ea">:</span> <span style="color:#f78c6c">800</span>px<span style="color:#c792ea">;</span>height<span style="color:#c792ea">:</span> <span style="color:#f78c6c">310</span>px<span style="color:#c792ea">;</span>float<span style="color:#c792ea">:</span> left<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span></code></span></span>WebRTC 允許通過兩種方式定義視頻流的大小。您可以在contraints傳遞給的變量中navigator.getUserMedia(contraints, success, error);定義它,也可以在 CSS 中定義它。在這個例子中,我們使用 CSS 來定義video本地視頻流和canvas元素的尺寸。
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-css"><span style="color:#c792ea">video</span> <span style="color:#c792ea">{</span>width<span style="color:#c792ea">:</span> <span style="color:#f78c6c">360</span>px<span style="color:#c792ea">;</span>height<span style="color:#c792ea">:</span> <span style="color:#f78c6c">270</span>px<span style="color:#c792ea">;</span>float<span style="color:#c792ea">:</span> left<span style="color:#c792ea">;</span>margin<span style="color:#c792ea">:</span> <span style="color:#f78c6c">20</span>px<span style="color:#c792ea">;</span>background-color<span style="color:#c792ea">:</span> #333<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">canvas</span> <span style="color:#c792ea">{</span>width<span style="color:#c792ea">:</span> <span style="color:#f78c6c">360</span>px<span style="color:#c792ea">;</span>height<span style="color:#c792ea">:</span> <span style="color:#f78c6c">270</span>px<span style="color:#c792ea">;</span>float<span style="color:#c792ea">:</span> left<span style="color:#c792ea">;</span>margin<span style="color:#c792ea">:</span> <span style="color:#f78c6c">20</span>px<span style="color:#c792ea">;</span>background-color<span style="color:#c792ea">:</span> #777<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span></code></span></span>接下來我們給我們的按鈕一點閃光。我們將隱藏我們的過濾器和快照按鈕,直到我們可以使用 訪問我們的麥克風和攝像頭getUserMedia()。
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-css"><span style="color:#c792ea">.buttons</span> <span style="color:#c792ea">{</span>margin-left<span style="color:#c792ea">:</span> <span style="color:#f78c6c">20</span>px<span style="color:#c792ea">;</span>float<span style="color:#c792ea">:</span> left<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">button</span> <span style="color:#c792ea">{</span>background-color<span style="color:#c792ea">:</span> #d84a38<span style="color:#c792ea">;</span>border<span style="color:#c792ea">:</span> none<span style="color:#c792ea">;</span>border-radius<span style="color:#c792ea">:</span> <span style="color:#f78c6c">2</span>px<span style="color:#c792ea">;</span>color<span style="color:#c792ea">:</span> white<span style="color:#c792ea">;</span>font-family<span style="color:#c792ea">:</span> <span style="background-color:rgba(255, 255, 255, 0.5)"><span style="color:#9a6e3a">'Open Sans'</span></span><span style="color:#c792ea">,</span> sans-serif<span style="color:#c792ea">;</span>font-size<span style="color:#c792ea">:</span> <span style="color:#f78c6c">0.8</span>em<span style="color:#c792ea">;</span>margin<span style="color:#c792ea">:</span> <span style="color:#f78c6c">0</span> <span style="color:#f78c6c">0</span> <span style="color:#f78c6c">1</span>em <span style="color:#f78c6c">0</span><span style="color:#c792ea">;</span>padding<span style="color:#c792ea">:</span> <span style="color:#f78c6c">0.5</span>em <span style="color:#f78c6c">0.7</span>em <span style="color:#f78c6c">0.6</span>em <span style="color:#f78c6c">0.7</span>em<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">button:active</span> <span style="color:#c792ea">{</span>background-color<span style="color:#c792ea">:</span> #cf402f<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">button:hover</span> <span style="color:#c792ea">{</span>background-color<span style="color:#c792ea">:</span> #cf402f<span style="color:#c792ea">;</span>cursor<span style="color:#c792ea">:</span> pointer<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">#filter<span style="color:#c792ea">,</span> #snapshot</span> <span style="color:#c792ea">{</span>display<span style="color:#c792ea">:</span> none<span style="color:#c792ea">;</span>margin-right<span style="color:#c792ea">:</span> <span style="color:#f78c6c">20</span>px<span style="color:#c792ea">;</span>float<span style="color:#c792ea">:</span> left<span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span></code></span></span>接下來,我將使用 CSS 定義照相亭的過濾器。您可以在相關的 MDN 頁面上找到支持的過濾器列表。
<span style="background-color:#292d3e"><span style="color:#bfc7d5"><code class="language-css"><span style="color:#c792ea">.blur</span> <span style="color:#c792ea">{</span>filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">blur</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">2</span>px<span style="color:#c792ea">)</span><span style="color:#c792ea">;</span>-webkit-filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">blur</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">2</span>px<span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">.grayscale</span> <span style="color:#c792ea">{</span>filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">grayscale</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">1</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span>-webkit-filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">grayscale</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">1</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">.sepia</span> <span style="color:#c792ea">{</span>filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">sepia</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">1</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span>-webkit-filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">sepia</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">1</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">.brightness</span> <span style="color:#c792ea">{</span>filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">brightness</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">2.2</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span>-webkit-filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">brightness</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">2.2</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">.contrast</span> <span style="color:#c792ea">{</span>filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">contrast</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">3</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span>-webkit-filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">contrast</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">3</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">.hue</span> <span style="color:#c792ea">{</span>filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">hue-rotate</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">120</span>deg<span style="color:#c792ea">)</span><span style="color:#c792ea">;</span>-webkit-filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">hue-rotate</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">120</span>deg<span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">.invert</span> <span style="color:#c792ea">{</span>filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">invert</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">1</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span>-webkit-filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">invert</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">1</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span><span style="color:#c792ea">.saturate</span> <span style="color:#c792ea">{</span>filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">staurate</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">5</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span>-webkit-filter<span style="color:#c792ea">:</span> <span style="color:#82aaff">staurate</span><span style="color:#c792ea">(</span><span style="color:#f78c6c">5</span><span style="color:#c792ea">)</span><span style="color:#c792ea">;</span> <span style="color:#c792ea">}</span></code></span></span>如果您熟悉 MailChimp,您可能已經注意到使用網絡攝像頭添加個人資料圖片的功能。MailChimp 為其用戶添加了一個簡單但有效的解決方案,以使用與此演示類似的方式使用 WebRTC 修改他們的個人資料圖像。
本文中開發的代碼可在 GitHub 上找到。您可以在WebRTC Challenge上查看照片應用程序的現場演示。
兼容性
因此,您可能想知道 WebRTC 在瀏覽器供應商和移動設備上的可用性。就目前而言,WebRTC 僅與 Chrome、Firefox 和 Opera 的桌面版本以及 Android 上的移動瀏覽器兼容。WebRTC 尚未在 iOS 上用于移動瀏覽器,但您可以使用本機庫來構建您的 iOS 和 Android 應用程序。微軟正在積極推動對象實時通信 (ORTC),目前計劃成為 WebRTC 1.1 規范的一部分。在那之前,有一種解決方法是使用 Temasys 的托管開源插件來支持 Internet Explorer 和 Safari。
愛立信目前正在通過他們的“Bowser”應用程序支持 WebRTC,您可以從 Apple應用商店下載該應用程序。它是他們新框架OpenWebRTC的一部分,OpenWebRTC是一個基于 GStreamer 的跨平臺 WebRTC 客戶端框架。
網站iswebrtcreadyyet.com是一個方便的工具,可用于檢查您喜歡的瀏覽器的狀態。
WebRTC 資源
Web 實時通信是一項激動人心的技術,它為創新打開了大門。開發人員現在可以增強用戶體驗并在其應用程序中提供上下文信息。以下是一些資源,您可以查看這些資源以查找有關 WebRTC 的更多信息。
- Webrtc.org主頁,由 Google Chrome 團隊維護
- 使用 WebRTC 進行實時通信:Google I/O 2013 演示文稿
- WebRTC GitHub 存儲庫
如果您想使用 WebRTC 與朋友進行簡單的會議或對話,以下是您可以免費使用的資源列表:
- Tawk.com
- Talky.io
- Appear.in
WebRTC 挑戰
如果您想了解更多有關 WebRTC 生態系統的信息,請前往WebRTC 挑戰賽。這是Blacc Spot Media團隊發起的一項新計劃,旨在向 Web 和移動社區的開發人員介紹和教育 WebRTC 的好處和功能。
結論
這只是 Web 實時通信 (WebRTC) 的強大功能的一瞥??。隨著我們繼續這個系列,我們將深入探討 WebRTC 的末端和外在,它在市場中的地位以及大小公司如何已經開始利用它的力量。重要的是要記住,WebRTC不是一個開箱即用的解決方案,而是一個允許您增強應用程序的工具。敬請期待更多!
總結
以上是生活随笔為你收集整理的WebRTC 的黎明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看雪论坛追加加密解密
- 下一篇: win7注册表修改默认浏览器