基於webrtc的android和windows音視頻通訊


基於webrtc的android和windows音視頻通訊 如果想在一台機器上做測試需要改下代碼:

 

 1 void Conductor::AddStreams() {
 2 if (active_streams_.find(kStreamLabel) != active_streams_.end())
 3 return; // Already added.
 4 
 5 rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
 6 peer_connection_factory_->CreateAudioTrack(
 7 kAudioLabel, peer_connection_factory_->CreateAudioSource(NULL)));
 8 
 9 rtc::scoped_refptr<webrtc::MediaStreamInterface> stream =
10 peer_connection_factory_->CreateLocalMediaStream(kStreamLabel);
11 
12 cricket::VideoCapturer *video = OpenVideoCaptureDevice();
13 if (video)
14 {
15 rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track(
16 peer_connection_factory_->CreateVideoTrack(
17 kVideoLabel,
18 peer_connection_factory_->CreateVideoSource(video,
19 NULL)));
20 main_wnd_->StartLocalRenderer(video_track);
21 
22 stream->AddTrack(video_track);
23 }
24 
25 stream->AddTrack(audio_track);
26 
27 if (!peer_connection_->AddStream(stream)) {
28 LOG(LS_ERROR) << "Adding stream to PeerConnection failed";
29 }
30 typedef std::pair < std::string,
31 rtc::scoped_refptr<webrtc::MediaStreamInterface> >
32 MediaStreamPair;
33 active_streams_.insert(MediaStreamPair(stream->label(), stream));
34 main_wnd_->SwitchToStreamingUI();
35 }

 

注意:這里主要是因為攝像頭是程序獨占的,打開一個peerconnect_client.exe以后不能在本機再次開一個,否則視頻時候找不到攝像頭就崩潰了。當然你機器多的話可忽視上面代碼!

由於覺得webrtc的peer_connetc工程寫的很清晰明了,覺得android也應該是很簡單的,后來才發現並非如此。由於鄙人學個java,soandroid學起來並不難,對我理解android對於java就行Qt對於c++一樣,都是對語言的一種封裝(當然我只是打個比方,不恰當的話請見諒)。同樣經過了許多努力才搞到了android版本的webrtc代碼,(感謝@Antonius http://blog.csdn.net/chenyafei617/article/details/38085409),仔細研究了andoroid對webrtc的封裝,感慨為何c++為何沒有java那么簡潔優雅的語法呢?
很快就是着手做android的開發,由於網絡通訊用了rsa+aes加密,服務器用的c++,所以服務器要處理c++客戶端和android不同平台發過來的數據包(加密、解密、轉發等等),在處理跨平台加密上面浪費了兩三周的時間,經過不屑的努力,嘿嘿終於能相互通訊了。下面就是痛苦的開始!!!
首先像peerconnect_client.exe一樣,android先給windows客戶端發送sdp數據(包含了 ip、端口、音視頻編解碼等信息),當windows客戶端收到第一個sdp數據時(一共需要發送5個,后面4個主要是用於傳輸、打動、轉發等等)崩潰了!!!我開始懷疑是java和c++不同編碼的問題嗎,可我用的都是utf-8的編碼而且都是英文和數字,無語的很;於是我打印了android對windows的sdp日志A,有打印了windows對windows的sdp日志B,經過比較發現:兩個sdp數據結果完全一樣,包含的數據乃至屬性信息都完全一樣!!后來多次調試,又浪費了大約一個月的時間,我放棄了。。。。。。
我開始不再想這個問題,老婆問我為啥看不到你研究東西了,我說:沒思路,做不下去了。
無意間我想起我以前的同事有個日本的vps,而且送給我一個vpn賬號;我僥幸試了一下(大約半夜了)下載速度非常可觀,有400k/s,我開始嘗試下載webrtc的最新代碼,sync、 runhook了不知道多少次都失敗了,幾乎又浪費了一個月。后來在github認識了一個老外@vsimon,用我不咋滴的英語溝通了下,它提供了一個下載代碼的shell腳本,我萬分感謝。他的主頁https://github.com/vsimon,在這里你可以找到很多你想要的關於webrtc的東西。老外真的很夠意思,很耐心的解答,而且很願意開源,我真的很佩服!!!當天晚上我又試驗了一下,成功下載了所有的代碼已經runhook 但是編譯遇到了點小問題,由於webrtc編譯屬性中有一項是:將警告視為錯誤!:
解決這個問題很簡單,需要改一下系統的區域設置為美國,如下:

第二天晚上我又悄悄地下載了代碼,第二天早上一看,哇塞全部編譯通過,當時喜出望外,哪知道后面還會有諸多問題。
接着又找到了一個shell腳本,可以編譯ubuntu和ios的庫文件,地址公布一下:https://github.com/pristineio/webrtc-build-scripts 不過也經過了好久才搞到了android的代碼並且編譯出jar和so文件,感覺有了希望。
有了這些東西,我又開始搞android和windows的音視頻通訊。結果不在崩潰了,但是windows客戶端無法獲取攝像頭,搞了好幾次都是醉了。(由於windows使用ninja編譯的,沒有vs工程文件,不方便修改和調試,不過調試的話是有pdb文件的)。過了數日,我索性
set GYP_GENERATORS=ninja,ninja-msvs
#改成了
set GYP_GENERATORS=ninja,msvs
 
然后執行runhook 居然生成了vs2013的工程文件all.sln ,原來官方網上介紹的可能會失敗,真的是可能會失敗呀,意思就是可能會成功!!!
由此小小的修改后成功編譯出了所有的文件包含lib和exe,也能正確捕捉到攝像頭了。

再次跑了android和windows的通訊,發現windows傻傻的沒反應,這次又把我嚇壞了,我又擔心除了上面類似的問題。經過了仔細的排查,發現是我自己的失誤,上個代碼吧,呵呵:
rtc::EnsureWinsockInit();
rtc::Win32Thread w32_thread;
rtc::ThreadManager::Instance()->SetCurrentThread(&w32_thread);
 
不管你是WinMain還mian 這段代碼一定要放在webrtc的功能調用之前,索性直接放在WinMain函數第一行。這個東西是webrtc消息循環和內部發送消息的驅動。
有了這個東西再次跑了一下。哇,出現了兩張臉 :

 
windows端使用duilib做的界面庫,感謝開源的力量。

總結吧
所有的平台都是用webrtc的PeerConnectionFactory以及PeerConnection等等,這一次小小的實驗讓我了解到谷歌的強大,開源的強大,自己內心的強大才是真正的強大。
如今實現了android和windows的音視頻通訊,我揣測linux、mac和ios,瀏覽器的javascript等亦應該是如此的流程,殊途同歸(所以不要跟我要代碼,自己好好研究peerconnection_client,谷歌不是亂寫一個demo),事實上就是如此,我也已經驗證過了!!!
好幾年了沒有如此的成就感了,一直在擼代碼。鄙人一機械生出道,由於興趣開始學習編程,當時沒人指導,學了java,半年后發現其不適合做桌面應用,遂放棄了。導師要我做項目,然學習了c++,走上了一條不歸路,呵呵。大學時做了個開源項目:“quickwifi”,目的是方便大家使用電腦搭建wifi網絡供手機使用,后來出現了360一鍵wifi等等好多諸如此類的軟件,真的悔恨自己當初沒有堅持,或者說沒有人家那份眼光。只能怪自己愚昧嘍。webrtc我很看好他,不僅僅是他集成了業界最先進的技術,更看好的是音視頻在未來的應用場景:智能家居,視頻會議等等,試想一下,你走到哪一個角落任何一台電子設備都可以跟外界通訊那是何等有意思的事情。
另外本人還喜歡php,html,javascript等等,也寫過自己的blog,當時出於資金問題放棄了。
有興趣的話可以跟我溝通 emailto: 345252622@qq.com ,我很喜歡交朋友,也很喜歡幫助別人,大家一同進步。

附上源碼地址:
Server/Windows Client https://github.com/RainStream/P2PChat
Android Client https://github.com/RainStream/P2PChat_Android
————————————————
版權聲明:本文為CSDN博主「敬我歲月無波瀾」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/gupar/article/details/46868539


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM