最近兩年,我對於網絡知識,包括底層協議學習比較多,webrtc這種幾乎是使用到了所有層面網絡協議的技術也逐漸進入我的視野。
之前我提出了兩種在嵌入式設備上實現webrtc的方式,一是用官方代碼,然后改編譯鏈,但是這條路是留給c++高玩的,因為它的代碼是用最新的c++17寫的,你必須重寫adm(Audio Device Manager),我其實根本不會c++,平時只是改改同事的代碼,所以路是斷的;第二種是使用janus(實際上用到的就一兩百行代碼,我是直接參考webrtcgateway)和rtcdc組合拳,這個我根本沒法跟大家解釋原理,因為這條路我雖然走通了,但比前一條路應該是難太多,它要求你懂webrtc協議棧所有網絡協議,然后還得會使用和整合數個三方庫,期間你會移植十幾個庫……而且最終你還面臨沒有jitterbuffer的窘境,而且還得自己做aec(Acoustic Echo Cancellation)
實際上第二條路是很舒服的,如果走通,你會發現你進入了一個新境界。
好,廢話說太多了,進入正題,今天我介紹一個目前看起來更優於前兩個方法的webrtc嵌入式實現。他就是amazon-kinesis提供的設備端sdk。
https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c
大家可以看作是第二種方式的優化版本,畢竟是大廠,肯定比我們自己擰螺絲更健壯。
這篇文章主要是介紹如果編譯它,我仍然以海思系列芯片為例。
(首先我們可能需要一個牆外的服務器,我是在阿里雲買了一周的美國ecs,因為中途git clone太慢了)
1.先拉取代碼
git clone --recursive https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c.git
2.然后更改srtp的CMakeLists,不生成測試文件(因為它link.txt里面會寫-lpthread,我的嵌入式編譯器不認)
-D TEST_APPS=OFF
3.執行cmake
export CC=arm-himix200-linux-gcc CXX=arm-himix200-linux-g++ mkdir build && cd build cmake .. -DBUILD_SAMPLE=FALSE -DBUILD_STATIC_LIBS=TRUE -DBUILD_OPENSSL=TRUE -DBUILD_OPENSSL_PLATFORM=linux-generic32 -DBUILD_LIBSRTP_HOST_PLATFORM=x86_64-unknown-linux-gnu -DBUILD_LIBSRTP_DESTINATION_PLATFORM=arm-unknown-linux-uclibcgnueabi
其中BUILD_SAMPLE=FALSE對於我是必要的,因為跟2一樣,link.txt里面還是-lpthread
4.make
5.拿到所有編譯出來的.a和需要的.h。
除了這里的兩個.a和3個.h之外,還需要把引用的庫和頭文件拿出來
當然,實際上我們用不了這么多
(這里面編譯的openssl不知道為什么我用不了,如果你也爆下面的錯,你也跟我一樣重新編譯一下openssl)
我編譯openssl的指令如下(期間還需要刪一下-m32)
#setarch i686 ./Configure no-asm no-shared --prefix=/mnt/f/hisi/workspace/openssl-OpenSSL_1_1_0h/_install --cross-compile-prefix=arm-himix200-linux- linux-generic32 make
最后我們來生成一個sdp試試
編譯后放到設備上運行,輸出如下:
有高手希望指點的話可以通過微信與我聯系,我的id是wxid_8r2mjkbcu2an22
最后修改時間 2020-10-27 15:44:52
不好意思,忘了調用initKvsWebRtc。如果不調用的話字節序是錯誤的,會影響后續的ICE交互(下一章會講)
最后修改時間 2020-11-05 19:48:00