WebRTC Android API

WebRTC Android API

WebRTC For Android相關(guān)的API有VideoCapturerAndroid, VideoRenderer, MediaStream, PeerConnection 和 PeerConnectionFactory等盼砍。通過(guò)這些功能完善列另、說(shuō)明詳細(xì)的API,可以顯示任何想要顯示的本地音視頻流和遠(yuǎn)程音視頻流毒涧。下面我們將逐一講解昧港。

類(lèi)圖

WebRTC Android API類(lèi)圖

PeerConnectionFactory

PeerConnectionFactory是WebRTC Android API最核心的類(lèi)扔罪。理解這個(gè)類(lèi)并了解它如何使用是深入了解Android WebRTC開(kāi)發(fā)的關(guān)鍵始腾。
首先需要初始化PeerConnectionFactory,如下:
// First, we initiate the PeerConnectionFactory with // our application context and some options. PeerConnectionFactory.initializeAndroidGlobals( context, initializeAudio, initializeVideo, videoCodecHwAcceleration);

為了理解這個(gè)方法呕寝,需要了解每個(gè)參數(shù)的意義:

context
    應(yīng)用上下文勋眯,或者上下文相關(guān)的,和其他地方傳遞的一樣。

initializeAudio
    是否初始化音頻的布爾值凡恍。

initializeVideo
    是否初始化視頻的布爾值志秃。跳過(guò)這兩個(gè)就允許跳過(guò)請(qǐng)求API的相關(guān)權(quán)限,例如DataChannel應(yīng)用嚼酝。

videoCodecHwAcceleration
    是否允許硬件加速的布爾值浮还。

initializeAndroidGlobals()返回布爾值,true表示一切OK闽巩,false表示有失敗钧舌。

如果一切ok,可以使用PeerConnectionFactory 的構(gòu)造方法創(chuàng)建工廠:
PeerConnectionFactory peerConnectionFactory = new PeerConnectionFactory();

有了peerConnectionFactory實(shí)例涎跨,就可以從用戶設(shè)備獲取視頻和音頻洼冻,最終將其渲染到屏幕上。

VideoCapturerAndroid & CameraEnumerationAndroid

VideoCapturerAndroid是VideoCapturer接口的實(shí)現(xiàn)隅很,封裝了一系列Camera API撞牢,為訪問(wèn)攝像頭設(shè)備的流信息提供了方便。要?jiǎng)?chuàng)建VideoCapturerAndroid的實(shí)例叔营,首先需要通過(guò)CameraEnumerationAndroid類(lèi)獲取攝像頭設(shè)備基本信息屋彪,如數(shù)量、名稱绒尊。如下:

// Returns the number of camera devices
CameraEnumerationAndroid.getDeviceCount();

// Returns the name of the camera with camera index. Returns null if the
// camera can not be used.
CameraEnumerationAndroid.getDeviceName(0);

// Returns the front face device name
CameraEnumerationAndroid.getNameOfFrontFacingDevice();
// Returns the back facing device name
CameraEnumerationAndroid.getNameOfBackFacingDevice();
// Creates a VideoCapturerAndroid instance for the device name
VideoCapturerAndroid.create(name);

有了包含攝像流信息的VideoCapturerAndroid實(shí)例畜挥,就可以創(chuàng)建從本地設(shè)備獲取到的包含視頻流信息的MediaStream,從而發(fā)送給另一端婴谱。但做這些之前蟹但,我們首先研究下如何將自己的視頻顯示到應(yīng)用上面。

VideoSource & VideoTrack

從VideoCapturer實(shí)例中獲取一些有用信息谭羔,或者要達(dá)到最終目標(biāo)————為連接端獲取合適的媒體流华糖,或者僅僅是將它渲染給用戶,我們需要了解VideoSource 和 VideoTrack類(lèi)口糕。

VideoSource允許方法開(kāi)啟缅阳、停止設(shè)備捕獲視頻磕蛇。這在為了延長(zhǎng)電池壽命而禁止視頻捕獲的情況下比較有用景描。

VideoTrack 是簡(jiǎn)單的添加VideoSource到MediaStream 對(duì)象的一個(gè)封裝。

我們通過(guò)代碼看看它們是如何一起工作的秀撇。capturer是VideoCapturer的實(shí)例超棺,videoConstraints是MediaConstraints的實(shí)例。

// First we create a VideoSource
VideoSource videoSource = 
    peerConnectionFactory.createVideoSource(capturer, videoConstraints);

// Once we have that, we can create our VideoTrack
// Note that VIDEO_TRACK_ID can be any string that uniquely
// identifies that video track in your application
VideoTrack localVideoTrack = 
    peerConnectionFactory.createVideoTrack(VIDEO_TRACK_ID, videoSource);

AudioSource/AudioTrack

AudioSource和AudioTrack與VideoSource和VideoTrack相似呵燕,只是不需要AudioCapturer 來(lái)獲取麥克風(fēng)棠绘,audioConstraints是 MediaConstraints的一個(gè)實(shí)例。

// First we create an AudioSource
AudioSource audioSource =
    peerConnectionFactory.createAudioSource(audioConstraints);

// Once we have that, we can create our AudioTrack
// Note that AUDIO_TRACK_ID can be any string that uniquely
// identifies that audio track in your application
AudioTrack localAudioTrack =
    peerConnectionFactory.createAudioTrack(AUDIO_TRACK_ID, audioSource);

VideoRenderer

通過(guò)把VideoRenderer.Callbacks的實(shí)現(xiàn)作為參數(shù)傳入VideoRenderer的構(gòu)造方法,WebRTC允許實(shí)現(xiàn)自己的渲染氧苍。另外夜矗,它提供了一種非常好的默認(rèn)方式VideoRendererGui。簡(jiǎn)而言之让虐,VideoRendererGui是一個(gè)GLSurfaceView 紊撕,使用它可以繪制自己的視頻流。我們通過(guò)代碼看一下它是如何工作的赡突,以及如何添加renderer 到 VideoTrack对扶。

// To create our VideoRenderer, we can use the 
// included VideoRendererGui for simplicity
// First we need to set the GLSurfaceView that it should render to
GLSurfaceView videoView = (GLSurfaceView) findViewById(R.id.glview_call);

// Then we set that view, and pass a Runnable
// to run once the surface is ready
VideoRendererGui.setView(videoView, runnable);

// Now that VideoRendererGui is ready, we can get our VideoRenderer
VideoRenderer renderer = VideoRendererGui.createGui(x, y, width, height);

// And finally, with our VideoRenderer ready, we
// can add our renderer to the VideoTrack.
localVideoTrack.addRenderer(renderer);

也可以通過(guò)SurfaceViewRenderer創(chuàng)建VideoRenderer的實(shí)例并添加到VideoTrack。SurfaceViewRenderer是一個(gè)SurfaceView并實(shí)現(xiàn)了VideoRenderer.Callbacks接口惭缰。

SurfaceViewRenderer localRender = (SurfaceViewRenderer) findViewById(R.id.local_video_view);

VideoRenderer renderer = new VideoRenderer(localRender);

localVideoTrack.addRenderer(renderer);

MediaConstraints

MediaConstraints是MediaStream中音頻和視頻軌道的各種約束浪南。對(duì)于大多數(shù)需要MediaConstraints的方法,一個(gè)簡(jiǎn)單的MediaConstraints實(shí)例就可以做到漱受。

MediaConstraints audioConstraints = new MediaConstraints();

MediaStream

現(xiàn)在可以在本地看見(jiàn)自己了络凿,接下來(lái)就要想辦法讓對(duì)方看見(jiàn)自己。這需要?jiǎng)?chuàng)建MediaStream昂羡,然后將其添加到PeerConnection 傳送給對(duì)方喷众。接下來(lái)我們就研究如何添加本地的VideoTrack 和AudioTrack來(lái)創(chuàng)建一個(gè)合適的MediaStream。

// We start out with an empty MediaStream object, 
// created with help from our PeerConnectionFactory
// Note that LOCAL_MEDIA_STREAM_ID can be any string
MediaStream mediaStream = peerConnectionFactory.createLocalMediaStream(LOCAL_MEDIA_STREAM_ID);

// Now we can add our tracks.
mediaStream.addTrack(localVideoTrack);
mediaStream.addTrack(localAudioTrack);

我們現(xiàn)在有了包含視頻流和音頻流的MediaStream實(shí)例紧憾,而且在屏幕上顯示了我們的臉龐〉角В現(xiàn)在就該把這些信息傳送給對(duì)方了。

PeerConnection

現(xiàn)在我們有了自己的MediaStream赴穗,就可以開(kāi)始連接遠(yuǎn)端了憔四。這可以通過(guò)PeerConnection實(shí)現(xiàn)。創(chuàng)建PeerConnection很簡(jiǎn)單般眉,只需要PeerConnectionFactory的協(xié)助即可了赵。

PeerConnection peerConnection = peerConnectionFactory.createPeerConnection( iceServers, constraints,  observer);

參數(shù)的作用如下:

iceServers
    連接到外部設(shè)備或者網(wǎng)絡(luò)時(shí)需要用到這個(gè)參數(shù)。在這里添加STUN 和 TURN 服務(wù)器就允許進(jìn)行連接甸赃,即使在網(wǎng)絡(luò)條件很差的條件下柿汛。

constraints
    MediaConstraints的一個(gè)實(shí)例,應(yīng)該包含offerToRecieveAudio 和 offerToRecieveVideo

observer
     PeerConnection.Observer的一個(gè)實(shí)例埠对。

PeerConnection 包含了addStream络断、addIceCandidate、createOffer项玛、createAnswer貌笨、getLocalDescription、setRemoteDescription 和其他類(lèi)似方法襟沮。我們快速瀏覽一下這幾個(gè)重要的方法锥惋,看它們是如何工作的昌腰。
addStream
這個(gè)是用來(lái)將MediaStream 添加到PeerConnection中的,如同它的命名一樣。如果你想要對(duì)方看到你的視頻膀跌、聽(tīng)到你的聲音遭商,就需要用到這個(gè)方法。

addIceCandidate
一旦內(nèi)部IceFramework發(fā)現(xiàn)有candidates允許其他方連接你時(shí)捅伤,就會(huì)創(chuàng)建IceCandidates 株婴。當(dāng)通過(guò)PeerConnectionObserver.onIceCandidate傳遞數(shù)據(jù)到對(duì)方時(shí),需要通過(guò)任何一個(gè)你選擇的信號(hào)通道獲取到對(duì)方的IceCandidates暑认。使用addIceCandidate 添加它們到PeerConnection困介,以便PeerConnection可以通過(guò)已有信息試圖連接對(duì)方。

createOffer/createAnswer
這兩個(gè)方法用于原始通話的建立蘸际。如你所知座哩,在WebRTC中,已經(jīng)有了caller和callee的概念粮彤,一個(gè)是呼叫根穷,一個(gè)是應(yīng)答。createOffer是caller使用的导坟,它需要一個(gè)sdpObserver屿良,它允許獲取和傳輸會(huì)話描述協(xié)議Session Description Protocol (SDP)給對(duì)方,還需要一個(gè)MediaConstraint惫周。一旦對(duì)方得到了這個(gè)請(qǐng)求尘惧,它將創(chuàng)建一個(gè)應(yīng)答并將其傳輸給caller。SDP是用來(lái)給對(duì)方描述期望格式的數(shù)據(jù)(如video递递、formats喷橙、codecs、encryption登舞、resolution贰逾、 size等)。一旦caller收到這個(gè)應(yīng)答信息菠秒,雙方就相互建立的通信需求達(dá)成了一致疙剑,如視頻、音頻践叠、解碼器等言缤。

setLocalDescription/setRemoteDescription
這個(gè)是用來(lái)設(shè)置createOffer和createAnswer產(chǎn)生的SDP數(shù)據(jù)的,包含從遠(yuǎn)端獲取到的數(shù)據(jù)酵熙。它允許內(nèi)部PeerConnection 配置鏈接以便一旦開(kāi)始傳輸音頻和視頻就可以開(kāi)始真正工作轧简。

PeerConnection.Observer

這個(gè)接口提供了一種監(jiān)測(cè)PeerConnection事件的方法驰坊,例如收到MediaStream時(shí)匾二,或者發(fā)現(xiàn)iceCandidates 時(shí),或者需要重新建立通訊時(shí)。這個(gè)接口必須被實(shí)現(xiàn)察藐,以便你可以有效處理收到的事件皮璧,例如當(dāng)對(duì)方變?yōu)榭梢?jiàn)時(shí),向他們發(fā)送信號(hào)iceCandidates分飞。

調(diào)用順序

發(fā)起呼叫
發(fā)起呼叫
接受呼叫
接受呼叫
關(guān)閉連接
關(guān)閉連接

Demo

AppRTCDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悴务,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子譬猫,更是在濱河造成了極大的恐慌讯檐,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件染服,死亡現(xiàn)場(chǎng)離奇詭異别洪,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)柳刮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)挖垛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人秉颗,你說(shuō)我怎么就攤上這事痢毒。” “怎么了蚕甥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵哪替,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我菇怀,道長(zhǎng)夷家,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任敏释,我火速辦了婚禮库快,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钥顽。我一直安慰自己义屏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布蜂大。 她就那樣靜靜地躺著闽铐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奶浦。 梳的紋絲不亂的頭發(fā)上兄墅,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音澳叉,去河邊找鬼隙咸。 笑死沐悦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的五督。 我是一名探鬼主播藏否,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼充包!你這毒婦竟也來(lái)了副签?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤基矮,失蹤者是張志新(化名)和其女友劉穎淆储,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體家浇,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遏考,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓝谨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灌具。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖譬巫,靈堂內(nèi)的尸體忽然破棺而出咖楣,到底是詐尸還是另有隱情,我是刑警寧澤芦昔,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布诱贿,位于F島的核電站,受9級(jí)特大地震影響咕缎,放射性物質(zhì)發(fā)生泄漏珠十。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一凭豪、第九天 我趴在偏房一處隱蔽的房頂上張望焙蹭。 院中可真熱鬧,春花似錦嫂伞、人聲如沸孔厉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撰豺。三九已至,卻和暖如春拼余,著一層夾襖步出監(jiān)牢的瞬間污桦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工匙监, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凡橱,地道東北人小作。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像梭纹,于是被迫代替她去往敵國(guó)和親躲惰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子致份,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 翻譯?http://www.html5rocks.com/en/tutorials/webrtc/infrastr...
    bktmkd閱讀 6,310評(píng)論 1 28
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理变抽,服務(wù)發(fā)現(xiàn),斷路器氮块,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 1,WebRTC入門(mén)基礎(chǔ) 什么是WebRTC WebRtc(Web Real-Time Communication...
    IOneStar閱讀 2,205評(píng)論 2 7
  • 前言: WebRTC绍载,名稱源自網(wǎng)頁(yè)實(shí)時(shí)通信(Web Real-Time Communication)的縮寫(xiě),簡(jiǎn)而言...
    涂耀輝閱讀 50,734評(píng)論 134 429
  • “親愛(ài)的滔蝉,早餐想吃點(diǎn)什么击儡?” “寶貝,只要你煮的我都喜歡蝠引⊙舻” “親愛(ài)的,中午想吃什么呢螃概?我送到你公司矫夯。” “只要你...
    咸極咸閱讀 257評(píng)論 3 3