WebRTC開發(fā)基礎(WebRTC入門系列1:getUserMedia)

課程地址:零聲學院 WebRTC入門與提高 https://ke.qq.com/course/435382?tuin=137bb271

技術(shù)支持QQ群:782508536

webrtc時序圖.png

版權(quán)聲明:關(guān)于作者:王昕(QQ:475660) 十多年開發(fā)經(jīng)驗,在Delphi、ASP.net、Cobol、WPF、C#、SharePoint、Java、XMPP Server/Client、EPortal、BPM等領(lǐng)域較有經(jīng)驗,對開源技術(shù)有廣泛興趣,尤其關(guān)注門戶平臺和即時通訊技術(shù),在廣州工作生活30余年。 https://blog.csdn.net/starcrm/article/details/52576387

博主有刪減,著作權(quán)歸原作者王昕所有。

什么是WebRTC

WebRTC由IETF(Internet Engineering Task Force——互聯(lián)網(wǎng)工程任務組)和W3C(World Wide Web Consortium——萬維網(wǎng)聯(lián)盟)聯(lián)合負責其標準化工作。IETF定制WebRTC的互聯(lián)網(wǎng)基礎協(xié)議標準,該標準也被稱為RTCWeb(Real-Time Communication in Web-browsers)。W3C則負責定制WebRTC的客戶端JavaScript API接口的標準。目前參與該技術(shù)標準定制的公司主要有思科、微軟、谷歌、蘋果、愛立信、Intel等。

WebRTC(Web Real-Time Communication——網(wǎng)頁實時通信)是一個基于瀏覽器的實時多媒體通信技術(shù)。該項技術(shù)旨在使Web瀏覽器具備實時通信能力;同時,通過將這些能力封裝并以JavaScript API的方式開放給Web應用開發(fā)人員,使得Web應用開發(fā)人員能夠通過HTML標簽和JavaScript API快速地開發(fā)出基于Web瀏覽器的實時音視頻應用,而無需依賴任何第三方插件。谷歌2011年6月3日宣布向開發(fā)人員開放WebRTC架構(gòu)的源代碼。

WebRTC的影響和前景

WebRTC技術(shù)的快速普及將對現(xiàn)有的很多領(lǐng)域產(chǎn)生巨大的影響。 首先,受到影響的是現(xiàn)有的VoIP業(yè)務領(lǐng)域。目前我們正在經(jīng)歷一個硬件多樣化的時代,比如可穿戴設備的興起。這將促進適應新型設備的操作系統(tǒng)的涌現(xiàn)和加大現(xiàn)有操作系統(tǒng)的分化。因此,操作系統(tǒng)的異構(gòu)性和繁雜性使得VoIP應用的開發(fā)、更新與維護的復雜性和成本劇增。隨著WebRTC集成到瀏覽器中,基于Web的實時通信應用可以通過HTML標簽和JavaScript API實現(xiàn)快速的開發(fā),并避免了由于操作系統(tǒng)的異構(gòu)性帶來的重復開發(fā)和由于版本升級帶來的維護費用以及不便。這將導致現(xiàn)有的應用開發(fā)人員從現(xiàn)有的基于瀏覽器插件或者原生VoIP應用模式轉(zhuǎn)向使用WebRTC進行Web應用開發(fā),進而使得現(xiàn)有的VoIP應用的普通用戶向基于瀏覽器的Web應用的遷移。目前,涉及VoIP業(yè)務的客服以及在線教育領(lǐng)域很關(guān)注WebRTC技術(shù)在自身領(lǐng)域的應用。

其次,現(xiàn)有的IM應用通過其擁有的大量用戶,并通過構(gòu)建在這些IM應用上的衍生應用形成生態(tài)圈。這些IM應用及其所形成的生態(tài)圈正在試圖取代瀏覽器成為互聯(lián)網(wǎng)入口。這種現(xiàn)象在移動智能終端表現(xiàn)的更加突出。然而,如上文所述,WebRTC技術(shù)的部署和使用將呈現(xiàn)爆炸式的增長,這將導致IM應用向IM Web應用的轉(zhuǎn)變和用戶向IM Web應用的遷移。因此,構(gòu)建在現(xiàn)有IM應用的生態(tài)圈將被打破。現(xiàn)有的IM應用及其生態(tài)圈必將做出相應的布局調(diào)整以適應新的技術(shù)環(huán)境。

同時,WebRTC的普及將給企業(yè)帶來監(jiān)管和安全問題。目前,有些公司在公司內(nèi)部封鎖了IM應用(比如QQ,Skype)的端口,以防止員工在工作過程中由于對音視頻工具的不慎使用所造成的安全問題?;赪ebRTC的新型IM Web應用,與正常的Web頁面無異,所以很難檢測該種IM Web應用。這給企業(yè)的監(jiān)管和安全造成了巨大的隱患。

其次,智能電視的展現(xiàn)形式和業(yè)務模式將受到巨大的影響。目前,智能電視主要包括智能操作系統(tǒng)以及顯示設備。在智能電視上的主要業(yè)務也主要是對多媒體源的直播和點播。隨著WebRTC的普及和涌現(xiàn)大量的IM Web應用,智能電視將很可能原生的包含攝像頭設備。同時,視頻會議業(yè)務也將像現(xiàn)在的對多媒體源的直播和點播業(yè)務一樣,成為智能電視的主要業(yè)務。

其次,所上文所述,由于WebRTC所支持的音視頻格式的局限,以及WebRTC在多人視頻會話中采用的可選網(wǎng)狀結(jié)構(gòu)的限制(目前是6人)。新型的服務供應商將產(chǎn)生。這些供應商主要提供1)不同視頻編解碼的轉(zhuǎn)換;2)在多人會話中,視頻流的整合與廣播。目前,服務供應商及其產(chǎn)品有:Dialogic推出的PowerMedia XMS 2.1和英特爾推出的Collaboration Service for WebRTC。

最后,集成了WebRTC的Web瀏覽器將進一步改變傳統(tǒng)的應用、Web瀏覽器和操作系統(tǒng)的格局。Web瀏覽器將成為介于操作系統(tǒng)與Web應用的一個平臺。為Web操作系統(tǒng)的普及進一步鋪平道路。包含了WebRTC的瀏覽器將進一步鞏固其互聯(lián)網(wǎng)入口的地位——近些年,超級應用(例如微信)通過其擁有的大量用戶和在其上的開發(fā)的衍生應用試圖成為互聯(lián)網(wǎng)入口。Web瀏覽器及其Web應用將成為一種生態(tài)圈。高性能瀏覽器的研發(fā)將成為下一個競爭熱點。而瀏覽器的安全問題將更加凸顯。

開發(fā)基礎知識

本文大部分翻譯自:

http://www.html5rocks.com/en/tutorials/webrtc/basics/

http://w3c.github.io/mediacapture-main/getusermedia.html

通常WebRTC程序需要實現(xiàn)以下需求:

  • 獲得流音頻,視頻或其他數(shù)據(jù)。
  • 獲取網(wǎng)絡信息,如IP地址和端口,與其他WebRTC客戶端(稱為節(jié)點)連接通訊、交換數(shù)據(jù),穿越NAT和防火墻。
  • 協(xié)調(diào)信令通信以報告錯誤、發(fā)起或關(guān)閉會話。
  • 客戶端之間交換媒體和客戶的信息,如分辨率和編解碼器。
  • 通信流音頻,視頻或數(shù)據(jù)。
  • MediaStream API代表同步流媒體。例如,從攝像頭和麥克風輸入的流有同步的視頻和音頻曲目。(不要混淆mediastream軌道與<track>的元素,這是完全不同的東西。)

一個最簡單的例子:
https://webrtc.github.io/samples/src/content/getusermedia/gum.

官方范例
https://webrtc.github.io/samples/

1、輸入、輸出
每個MediaStream具有一個輸入,這可能由navigator.getUserMedia()生成;并僅具有一個輸出,傳遞到video element或RTCPeerConnection;

2、getUserMedia參數(shù)
getUserMedia()方法需要三個參數(shù):

  • 約束對象Constrain,通常是配置項;
  • 一個成功的回調(diào),通過一個MediaStream;
  • 一個失敗的回調(diào),失敗的回調(diào)是通過一個錯誤對象;

3、標簽label、MediaStreamTracks數(shù)組

每個MediaStream都有一個標簽label,如'xk7eulhsuhkbnjlwkw4yygnjj8onsgwhbvlq”
MediaStreamTracks數(shù)組是由getAudioTracks()和getVideoTracks()方法返回。

對于https://webrtc.github.io/samples/src/content/getusermedia/gum的例子
stream.getAudioTracks()返回一個空數(shù)組(因為沒有音頻)。
假設獲得一個網(wǎng)絡攝像頭連接,stream.getVideoTracks()將返回MediaStreamTrack數(shù)組,表示流來自攝像頭
每個MediaStreamTrack只有一種類型(“視頻”或“音頻”),和一個標簽label(類似于“FaceTime HD Camera(內(nèi)置)”)代表音頻或視頻的一個或多個通道。
在這種情況下(沒有音頻),gum的例子只有一個視頻軌跡和沒有音頻。
更多的場景:得到前置攝像頭,后置攝像頭,麥克風流,以及“屏幕分享screenshared ' 應用。

** 4、Blob URL**
Chrome or Opera中:URL.createObjectURL()方法把一個MediaStream轉(zhuǎn)換到Blob URL,可以設置為video element的src。

Blob URLs原理請閱讀:http://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers-bloburis
在Firefox中:視頻的src可以從流本身來設置。

版本M25以上,以Chrome為基礎的瀏覽器(Chrome和Opera),允許從getUserMedia音頻數(shù)據(jù)傳遞給音頻或視頻元素(但請注意,默認情況下是靜音的)。

getUserMedia 允許 as an input node for the Web Audio API:

// success callback when requesting audio input stream
function gotStream(stream) {
    window.AudioContext = window.AudioContext || window.webkitAudioContext;
    var audioContext = new AudioContext();

    // Create an AudioNode from the stream.
    var mediaStreamSource = audioContext.createMediaStreamSource( stream );

    // Connect it to the destination to hear yourself (or any other node for processing!)
    mediaStreamSource.connect( audioContext.destination );
}

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
navigator.getUserMedia( {audio:true}, gotStream );

Chrome瀏覽器添加音頻捕獲和/或videoCapture權(quán)限允許權(quán)限請求,可以只授予一次,此后,用戶不被要求授予照相機或麥克風訪問權(quán)限。同樣的,在使用HTTPS網(wǎng)頁:也只有授予一次(在Chrome至少一次)。顯示在瀏覽器中的信息欄的始終允許“Always Allow”按鈕。

此外,Chrome將在2015年底棄用getUserMedia()的HTTP訪問。在Chrome M44你已經(jīng)可以看到一個警告信息。

未來MediaStream可做為任何流的數(shù)據(jù)源,而不僅僅是照相機或麥克風。例如傳感器或其它輸入。

一些好玩的例子:

Webcam Toy is a photobooth app that uses WebGL to add weird and wonderful effects to photos which can be shared or saved locally.
FaceKat is a 'face tracking' game built with headtrackr.js.
ASCII Camera uses the Canvas API to generate ASCII images.

5、Constraints

用于設置視頻分辨率getUserMedia()和RTCPeerConnection addStream()調(diào)用。
其目的是為執(zhí)行其他約束,諸如寬高比,面向模式(正面或背面相機),幀率,高度和寬度......

例子:

getUserMedia({
     video: {
       mandatory: { minAspectRatio: 1.333, maxAspectRatio: 1.334 },
       optional [
         { minFrameRate: 60 },
         { maxWidth: 640 },
         { maxHeigth: 480 }
       ]
     }
  }, successCallback, errorCallback);
Dictionary MediaTrackConstraints Members

advanced of type sequence<MediaTrackConstraintSet>
See Constraints and ConstraintSet for the definition of this element.

dictionary MediaTrackConstraintSet {

            ConstrainLong      width;
            ConstrainLong      height;
            ConstrainDouble    aspectRatio;
            ConstrainDouble    frameRate;
            ConstrainDOMString facingMode;
            ConstrainDouble    volume;
            ConstrainLong      sampleRate;
            ConstrainLong      sampleSize;
            ConstrainBoolean   echoCancellation;
            ConstrainDouble    latency;
            ConstrainLong      channelCount;
            ConstrainDOMString deviceId;
            ConstrainDOMString groupId;
};

更多Media Capture and Streams 相關(guān)細節(jié):

http://www.w3.org/TR/mediacapture-streams/

入門必讀資源:

  1. Getting Started with WebRTC
  2. Media Capture and Streams接口定義
  3. WebRTC API
  4. javascript并發(fā)開發(fā),必須了解Blob URLs原理
  5. webrtc samples
  6. webaudiodemos
  7. WebRTC samples Peer connection: audio only

以下內(nèi)容待續(xù)

rtcpeerconnection
rtcdatachannel
一個ASP.NET MVC 在線錄音錄像(音視頻錄制并上傳)Demo :
http://download.csdn.net/detail/starcrm/9394037

參考鏈接

http://javascript.ruanyifeng.com/htmlapi/webrtc.html
Andi Smith,Get Started with WebRTC
Thibault Imbert, From microphone to .WAV with: getUserMedia and Web Audio
Ian Devlin, Using the getUserMedia API with the HTML5 video and canvas elements
Eric Bidelman, Capturing Audio & Video in HTML5
Sam Dutton, Getting Started with WebRTC
Dan Ristic, WebRTC data channels
Justin Uberti, Sam Dutton, WebRTC: Plugin-free realtime communication
Mozilla Developer Network, Taking webcam photos
Sam Dutton, WebRTC in the real world: STUN, TURN and signaling

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內(nèi)容