顯示具有 WebRTC 標籤的文章。 顯示所有文章
顯示具有 WebRTC 標籤的文章。 顯示所有文章

2014年4月23日 星期三

WebRTC-控制傳輸內容

在視訊電話時,我們有時會不想要讓對方聽到聲音或是看到影像,WebRTC中也有這種功能,以下是一個簡單的例子(使用WebRTC二部曲-RTCPeerConnection-下部(實作)的例子過修改)。

原理

我們在上次的範例中直接將自己的資料流(localStream)傳給遠端,但因為local端和remote端都是同一個資料流,所以在改變資料流的內容的時候會連自己的都被改掉(你不想讓對方看到你的視訊影像,卻連自己都看不到自己的影像了),所以我們就要先新增一個新的MediaStream專門給remote端使用,這樣我們就可以對這個remote端的資料流做處理也不會影響到local端的資料流了。

實作

Step 1

上次的例子中新增兩個check boxs :

Step 2

新增onclick事件
這裡我們利用getAudio(Video)Tracks()[0]來取得資料流的資訊,然後將enabled屬性做調整就可以達到控制的目的

Step 3

將localStream複製成remoteStream丟給remote peer

2014年4月18日 星期五

WebRTC二部曲-RTCPeerConnection-下部(實作)

平台

  • Visual studio 2012
  • adapter.js(WebRTC跨平台的shim)

目的

這次實作我們要在同一個視窗中開啟兩個視訊畫面,當我們按下Start鍵時我們可以在第一個畫面(Caller)將webcam抓到的畫面顯示,而當我們按下Call鍵時會利用RTCPeerConnection連線取得Stream顯示在第二個畫面(Callee),而HangUp鍵就是關閉連線,雖然這樣做實際性不高,但這樣的Demo可以很清楚地了解RTCPeerConnection的運作原理。

實作

Step 0 : adapter.js

在開始之前,我們要先解決一個擾人的問題-跨平台,就想我們在Demo getUserMedia的時候因為不同的Browser有不同的函式名稱,導致我們要去做一些處理才能確保他能在各個平台上運作,為了省去這樣的麻煩我們將使用adapter.js來cover這些問題。

Step 1 : html

我們一開始先設置需要的js及tag


Step2 : RTCPeerConnectionDemo.js

添加onclick事件給每個Button



Start : 利用webcam取得畫面(聲音)



Call : 設置RTCPeerConnection


1.設置Local跟Remote的Connection的handler
  •  onicecandidate : 還記得上次的圖中的送信人(candidate)嗎?onicecandidate就是在將找到的送信人給記起來
  • onaddstream(我們的demo中local peer並不需要接收stream所以local peer沒有此handler) : 當接收到stream時所要做的動作,在這裡我們將stream放到id為videoRemote的<video>中

2.將要傳送的stream放入connection中
3.建立offer及answer
  • local Peer建立offer
  • 將自己(local)的地址(local description)記下來
  • 當對方(remote)收到地址(remote description)時記下來
  • 對方(remote)也會把自己的地址(local description)記下來
  • 對方(remote)發送answer給自己(local)
  • 自己(local)會把對方的地址(remote description)記下來


HangUp : 關閉連線



2014年4月3日 星期四

WebRTC二部曲-RTCPeerConnection-上部(架構介紹)

RTCPeerConnection讓我們可以簡單的實現網頁上的p2p傳送機制,在接下來的文章中要帶大家來了解這個陌生的朋友

架構圖

先看架構圖,待會看步驟會比較清楚

步驟

在開始實作之前,我先來解釋RTCPeerConnection的運作步驟,我以擬人化的方式講解,應該比較可以理解 :

  1. 有一天Peter(Caller)想要寫信(stream)給Sunny(Callee)
  2. Peter(Caller)先將信封袋(RTCPeerConnection)給準備好,然後拿到自己家的資料(CreateOffer)並記下自己的地址(SDP)
  3. 但是Peter(Caller)並不知道Sunny(Callee)在哪裡,於是Peter(Caller)將自己的地址(SDP)送到一個收發站(server side)去等待Sunny(Callee)的到來
  4. Sunny(Callee)她也想要跟Peter(Caller)寫信(stream)了,Sunny(Callee)到了收發站(server side)發現已經有Peter(Caller)的地址(SDP)了,於是Sunny(Callee)把Peter(Caller)的地址(SDP)記起來然後把自己的地址(SDP)寫在信封袋(RTCPeerConnection)上回傳給Peter(Caller),這樣一來雙方都有對方和自己的地址(SDP)了
  5. 同時,由於Peter(Caller)及Sunny(Callee)他們都被困在城牆(NAT or Fire Wall)內,所以就必須要把信交給人力資源銀行(ICE server),他們會找到可以送信的人(candidate)
  6. 於是Peter(Caller)和Sunny(Callee)終於可以藉由RTCPeerConnection傳信了,YA!!
我覺得RTCPeerConnection最難的就在於要理解他的運行,只要了解了,我們實作起來就會輕鬆許多,所以這次就到這裡,先把這寫消化,我們下次再來講實作的部分。

2014年3月29日 星期六

WebRTC首部曲-getUserMedia

之前已經看過了WebRTC的一些背景知識,現在就來看看要如何實作吧,首先我們要介紹的是getUserMedia,這個API是為了要讓broswer可以取得攝影機及麥克風的訊息,以前我們要使用攝影機通常都還是要安裝一些應用程式才能抓到攝影機及麥克風,可是getUserMedia不須安裝任何插件,哈哈,是不是很方便阿。

我們先來看一下getUserMedia這位主角的基本資料 :

Syntax


Parameter

  • constraints : 設定media type
  • successCallback : 當成功取得media stream所做的function
  • errorCallback : 當發生錯誤時做此function
來看一下這個getUserMedia,它本身有三個parameters : 

constraints是對這個media type所做的設定,像是要取得影像還是聲音等等...。

successCallback是成功取得media stream之後要做的function,像是我們可能會想要把影像放到<video>裡顯示在網頁上。

而最後一個就是我們最不想看到的errorCallback了,如果錯誤發生(QQ)就會執行這個,這裡面可以擺一些補救措施,例如視訊發生錯無時會撥放別的影片,也可以用log紀錄錯誤訊息。

Demo

這個demo所要做的就是要單純的把攝影機及麥克風所取得的資訊顯示在網頁上。

Step1

首先我們要先讓media stream在網頁上有一個<video>(舞台),這樣它才能大顯身手 :
注意 : 一定要把autoplay設好,要不然影像會被定格喔。

Step2

再來就是這次的重點了,我們要設定好3個parameters,才能使getUserMedia乖乖運轉不出錯 : 
這裡我們將constraints中的audio和video的屬性值都設為true,表示我們要取得audio和video,success中我們要將傳回來的stream放到<video>中,在這裡因為這個stream是一個Blob object,所以我們要將這個object轉成src可以吃的URL,這樣我們的<video>才不會拉肚子,最後我們在error中輸出log。

注意 : 有些人會懶得設定errorCallBack,但是我建議養成好習慣至少印出log,這樣在debug的時候會輕鬆很多唷(我自己就是血淋淋的例子@@)。

做到這裡先來讓它跑一下吧,應該會出現以下的錯誤 :







會發生這個錯誤是因為跨遊覽器的問題,getUserMedia在不同的browser中有不同的名字,像在chrome叫做webkitGetUserMedia,在FireFox中叫做mozGetUserMedia,這種情形其實並不少見,因此就產生了modernizr這個方便的小工具,它可以處理網頁跨平台所產生的問題,這邊我們先不使用modernizr,我們使用下列判斷來處理這個問題 :

Step3

在browser上執行,你應該會看到下面的提醒 :




按下允許之後就會出現你帥氣(漂亮)的臉了。

結論

這次的demo讓我們學習到了要如何藉由browser去存取webcam及mic,而getUserMedia它傳回的是一個stream,所以你當然可以對它做一些處理(像是淡化、銳化、長寬等等),但是這個主題的重點沒有放在那裏,所以我就先不說了,今天就先到這裡,再見嘍。

參考資料

2014年3月28日 星期五

WebRTC前傳 : 介紹

最近因為老闆要我研究一下webRTC,所以我就花了一點時間去玩一下這個玩意兒,發現這東西真的是滿有趣的,又有一些心得,因此放上來分享給大家。

首先我先來大概地介紹一下webRTC好了,以下是webRTC的概述(節錄自wiki) :

WebRTC (Web Real-Time Communication) is an API definition drafted by the World Wide Web Consortium (W3C) that supports browser-to-browser applications for voice callingvideo chat, and P2P file sharing without plugins.

由上述我們知道webRTC是一個為了要在browser上不使用plugins,單單以browser就可以達到聊天、視訊或是p2p檔案的分享目的所開發的一個API。

WebRTC主要分為三個部分(API)(節錄自wiki) : 

  • getUserMedia : which allows a web browser to access the camera and microphone and to capture media
  • RTCPeerConnection : which sets up audio/video calls
  • RTCDataChannels : which allow browsers to share data via peer-to-peer

getUserMedia可以使browser接收webcam及mic的訊號,RTCPeerConnection可以處理點對點傳輸所需要的設定,而RTCDataChannels則是p2p的傳輸。


下面是WebRTC一些的介紹影片 :


WebRTC Demo



Google I/O 2012



Google I/O 2013



相容性(Can I use)


下次會使用WebRTC來實作一個簡單的視訊demo。

我是一個新手,也請各位不吝賜教^^,再見嘍。