webrtc学习记录

5G时代webrtc会变得更加流行吗?

服务器使用mediasoup ,对接webrtc的native 开发.

可以使用的编译选项 
gn gen out/linux --args='target_os="linux" target_cpu="x64" is_debug=true is_clang=false treat_warnings_as_errors=false rtc_include_tests=false  is_clang=false   rtc_use_h264=true is_component_build=false use_custom_libcxx=false rtc_enable_protobuf=false use_rtti=true proprietary_codecs=true '  --ide="qtcreator"

 

 

 1.可执行程序使用webrtc的时候需要增加第三方头文件的包含目录.

 

//libmediasoupclient的编译
cmake . -Bbuild  -DLIBWEBRTC_INCLUDE_PATH:PATH=/home/yang/webrtc/agora/webrtc/src/  -DLIBWEBRTC_BINARY_PATH:PATH=/home/yang/newtest/webrtc/agora/webrtc/src/out/Release/obj  


  -DOPENSSL_INCLUDE_DIR:PATH=${PATH_TO_OPENSSL_HEADERS}      \
  -DCMAKE_USE_OPENSSL=ON

gclient是用来同步代码,在和src同级目录会有一个隐藏.gclient文件,里面记录了基本的代码拉取设置
src里面的各个目录、甚至子目录,基本上都是一个独立的git库
 gclient sync的命令回去检查整个项目的完整情况,并同步代码
如果gclient sync无法通过,一般都不是代码的问题,是因为工具链或依赖库和当前代码需要的不一致
gclient是用来同步代码和工具链的
gn 是用来产生ninja所需的配置文件
ninja 才是编译的
代码里面有很多*.gni,可以认为是和make脚本差不多的,是告诉ninja,我要编译某个项目
例如AppRTCMobile,需要哪些代码文件、以来哪些库

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWEBRTC_LINUX=1 -DWEBRTC_POSIX=1")

gn clean < out_dir>

删除输出目录的内容,除了args.gn和创建一个足以重新生成构建的忍者构建环境。
个人见解:该命令行作用应与xcode中clean操作功能相识,clean后out中目录相关目录会被删除,
但不需要重新gn新的一份,可直接用ninja编译。


add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)

 参考这个网址,意思是说gnustl过时了,应该用c++_shared。于是把APP_STL := gnustl_static改为APP_STL := c++_shared编译通过。

Problem was indeed that the library is built using libc++. Rebuilding on libstdc++ made the link suceed.
 .clang version 9 .0.0 (trunk 3576     92).


https://github.com/hujianhua888/webrtc_vs2015
https://webrtc.agora.io/
http://120.92.49.206:3232/chromiumsrc?page=3    
https://blog.csdn.net/bvngh3247/article/details/81298131
https://github.com/mpromonet/webrtc-streamer
https://github.com/hujianhua888/webrtc_vs2015

gn gen out/linux --args='is_debug=false is_clang=false  rtc_include_tests=false is_component_build=false use_custom_libcxx=false rtc_enable_protobuf=false'

gn gen out/linux-arm --args='is_debug=true target_os="linux" target_cpu="arm"  treat_warnings_as_errors=false is_component_build=false is_clang=false rtc_include_tests=false rtc_use_h264=true rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false   use_ozone=true  ide="qtcreator"'


//libmediasoup客户端的构建

cmake . -Bbuild -DLIBWEBRTC_INCLUDE_PATH:PATH=/home/yang/webrtc/agora/webrtc/src/  -DLIBWEBRTC_BINARY_PATH:PATH=/home/yang/newtest/webrtc/agora/webrtc/src/out/Release/obj   -DCMAKE_CXX_FLAGS="-fvisibility=hidden"


-D_GLIBCXX_USE_CXX11_ABI=0 // 链接到旧版本,未启用c++11特性,std::string是std::basic_string<char>,如将c++11下的string当作参数传入非c++11库,就会出现error: cannot convert 'const std::__cxx11::basic_string<char>' to 'const char*',或者未定义的方法引用(undefined reference)
-D_GLIBCXX_USE_CXX11_ABI=1 // 链接到新版本
#define _GLIBCXX_USE_CXX11_ABI 0
#define _GLIBCXX_USE_CXX11_ABI 1


QMAKE_CFLAGS     设置c编译器flag参数     QMAKE_CFLAGS += -g
QMAKE_CXXFLAGS     设置c++编译器flag参数     QMAKE_CXXFLAGS += -g
QMAKE_LFLAGS     设置链接器flag参数     QMAKE_LFLAGS += -rdynamic

rtti


下载和编译参照:http://depthlove.github.io/2019/05/02/webrtc-development-2-source-code-download-and-build/

最后的编译选项:

gn gen out/linux --args='target_os="linux" target_cpu="x64" is_debug=true is_clang=false treat_warnings_as_errors=false rtc_include_tests=false  is_clang=false   rtc_use_h264=true is_component_build=false use_custom_libcxx=false rtc_enable_protobuf=false use_rtti=true proprietary_codecs = true   ide="qtcreator"'

1、连接webrtc静态库时候出现:error adding symbols: Malformed archive

vi build/config/compiler/BUILD.gn

搜索 complete_static_lib

去掉arflags = [ "-T" ] ,不用-T

连接:https://bugs.chromium.org/p/chromium/issues/detail?id=801925

 

2、GLIBCXX_3.4.20 not found(required by /home/webrtc/src/lout/linux/protoc)

可以升级libstdc++6.so的库

或者rtc_enable_protobuf=false 不使用protobuf

 

3、用GCC编译器而不是clang编译,选项is_clang=false、

3.1出现各种警告导致错误退出

declared with attribute warn_unused_result [-Werror=unused-result]

解决——添加选项:is_clang=false treat_warnings_as_errors=falsse

3.2 ../../webrtc/base/array_view_unittest.cc:219:26: error: use of deleted function ‘rtc::BufferT<T>::BufferT(const rtc::BufferT<T>&) [with T = unsigned char]’

const rtc::Buffer cb = "very const";

解决——添加选项:rtc_include_tests=false

 

4、连接时候各种C++库连接不了问题

解决:use_custom_libcxx=false这是用来控制编译WebRtc时使用的c++库的。原因很简单,如果不加这个编译开关的话,WebRtc编译默认使用libc++来编译,而我们编译别的代码用的是libstdc++,这样在编译的过程中就会导致用到std::string的地方各种错误

但是不要用这个选项use_custom_libcxx_for_host=false不然会有各种库问题

6、fatal error: list: No such file or directory#include <list>

解决——export CPLUS_INCLUDE_PATH=/usr/include/c++/4.8:/usr/include/x86_64-linux-gnu/c++/4.8:$CPLUS_INCLUDE_PATH

 

5、webrtc编译出来的是静态库,如果你在编译一个动态库时候引用这个libwebrtc.a静态库,那么再用这个动态库取连接最终的应用程序时候,会报找不到webrtc的里面的标识。这个是本身特性的影响,如果要这样用,那么编译静态库时候要加入选项 -fPIC:表示编译为位置独立(地址无关)的代码 才允许这样使用。——因为webrtc编译还没有去人看,怎么加入这个选项,那么只能把代码中的libvrtp.so库去掉,直接编译执行程序。

 

插曲:

1、因为连接webrtc静态库时候出现:error adding symbols: Malformed archive问题,想看看静态库是否生成正确。才知道原来静态库可以解压成一个个.o文件,并且可以把多个静态库压缩成一个。

ar x /usr/local/lib/A.a——解压

ar x /usr/local/lib/B.a

ar x /usr/local/lib/C.a

ar cru libABC.a *.o——压缩

ranlib libABC.a——更新静态库的符号索引表 

 

2、apt-get 安装程序时候出现版本依赖问题

apt : Depends: libstdc++6 (>= 4.6) but it is not going to be installed

解决——2.1、通过ubuntu官网下载对应的deb包安装。

2.2、通过已有的机器在目录/var/cache/apt/archives/下查找对应的包,拷贝过去安装。
————————————————
版权声明:本文为CSDN博主「chenzhxvip」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011493488/article/details/91443043


然后是最坑的编译开关环节,要把WebRtc导入Qt并使用,坑还是很多的,这就是其中之一。搜索脚本里面的代码,只有一行有如下字样“gn gen”,这一句是执行gn工具,生成ninja文件,以用于下一步执行ninja编译。因此,编译开关是在这一句后面加的,下面是我修改以后的语句,有需要的小伙伴可以拷贝过去直接用或者根据自己的需要进行修改:

gn gen "$ARCH_OUT/$BUILD_TYPE" --args="$DEBUG_ARG symbol_level=1 target_os=\"linux\" target_cpu=\"${ARCH}\" use_custom_libcxx=false  proprietary_codecs=true use_custom_libcxx_for_host=false ffmpeg_branding=\"Chrome\"" --ide="qtcreator"
 

 
home/yang/build-bizchat-unknown-Debug/sdklib_wrapper/

 unix:QMAKE_RPATHDIR += $$OUT_PWD/3party/deepin/src


  unix:!mac:QMAKE_LFLAGS += -Wl,--rpath=your_path 


      QMAKE_POST_LINK += $$quote(cp $$PWD/*.md5 $$DESTDIR ;)

       !exists($$dst_dir):system(xcopy $$src_dir $$dst_dir /y /e)

gn gen out/Debug-mpis "--args=is_debug=true target_os=\"linux\" target_cpu=\"mips64el\" mips_arch_variant=\"loongson3\" mips_use_mmi=true is_component_build=false use_sysroot=false use_gold=false"


/home/yang/build-bizchat-unknown-Debug/3party/deepin/src:/usr/lib/x86_64-linux-gnu/:/home/yang/build-bizchat-unknown-Debug/sdklib_wrapper/:/home/yang/bizchat/bizBin/lib/:/usr/lib/x86_64-linux-gnu


local:
    "10002":"server failed"


    local_10002_serverFailed
    local_200002_confCreateTooMuch
    local_10106_avatarUpdateFailed


编译选项调整

WebRTC可以支持H264,但在Linux下编译时,默认没有打开。

rtc_use_h264,这个开关控制了是否使用 H264 (对应C++代码中的宏 WEBRTC_USE_H264),在 webrtc/webrtc.gni 文件中定义:

rtc_use_h264 = proprietary_codecs && !is_android && !is_ios

    1

proprietary_codecs 在 build/config/features.gni 中定义:

proprietary_codecs = is_chrome_branded || is_chromecast

    1

我在 Linux 下编译,branded 默认是 Chromium ,所以,proprietary_codecs 默认就是 false 。

想来想去,只好通过 gn gen 时传入 args 来调整比较方便,使用下面的命令来生成 ninja 构建文件:

gn gen out/h264Debug --args="proprietary_codecs=true"

    1

执行完毕后,可以使用下列命令验证一下:

gn args out/h264Debug --list=proprietary_codecs
gn args out/h264Debug --list=rtc_use_h264


https://192.168.1.120:3000/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值