在嵌入式设备中实现webrtc的第三种方式①

  最近两年,我对于网络知识,包括底层协议学习比较多,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

   

  make install时DESTDIR可以设置为../open-source,这样的话.a和.h在一起,比较方便拷贝

  我之前使用域外服务器的原因是openssl会拉取boringssl,好像可以使用mbed代替。即把

  -DBUILD_OPENSSL=TRUE  -DBUILD_OPENSSL_PLATFORM=linux-generic32

  改为
  -DUSE_OPENSSL=OFF -DUSE_MBEDTLS=ON
  (未验证功能,但编译是没问题的)
  最后修改时间 2022-09-01 15:55:58
posted @ 2020-10-27 15:55  云中双月  阅读(10121)  评论(1编辑  收藏  举报