暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

编译WebRTC库

贝贝猫技术分享 2019-10-17
1357

引言

最近一段时间的主要工作内容是开发一个远程控制手机的功能,其中音视频传输的部分是采用 WebRTC 技术来进行的,而我们的手机都是通过与其直接连接的 Agent 服务器进行管理,Agent 服务是 Java 写的,现在市面上又没有合适的 Java 版 WebRTC 库,所以我就基于 Google 开源代码,写了一个 JNI 调用 WebRTC Native 的库。这里先简单介绍一下在编译 WebRTC 的过程中遇到的一些坑,分享一下整个工作过程中的经验。

现有的编译工具

在编译 WebRTC Native Lib 这部分,我使用过 Github 上的两个开源方案:libwebrtc[1], webrtc-builds[2]

实现思路

简单的讲他们都是一系列脚本的集合,遵从 Google 提供的编译方案[3],自动地来帮您做以下工作:

  1. 下载编译 WebRTC 所需要的工具[4]

  2. 下载代码

  3. 根据您的需要切换到对应的分支

  4. 根据您指定的脚本参数来设置 WebRTC 的编译参数

  5. 编译代码

  6. 打包目标文件

  7. 安装库文件

区别

  • libwebrtc[5]: 使用 Cmake 模块封装各个子功能

  • webrtc-builds[6]:使用纯 Shell 脚本实现

我的选择

其中,我比较喜欢libwebrtc[7],一个原因是它的 README 介绍的比较详细,还有一个原因是其配合 CMake 使用超级方便,因为它帮你创建了一个 Cmake Lib,这样您仅需要几行就能引入该库。

    find_package(LibWebRTC REQUIRED)
    include(${LIBWEBRTC_USE_FILE})


    target_link_libraries(my-app ${LIBWEBRTC_LIBRARIES})

    而且NodeJS WebRTC[8]当时也是使用这个库来编译他们的 WebRTC 库的,不过后来他们转而从源码直接编译了,可能是因为这个库太久没更新吧.,毕竟这个库官方声称只支持到 M60 版本的 WebRTC。我这里由于业务的需要,要求 WebRTC Lib 的版本至少是 M68,所以我当时对这个库进行了部分修改,使其能够编译 M70 版本的 WebRTC,此外我还开了一些别的参数,从而达到一些业务目的。总之,如果您也和我一样,需要一些自定义设置的 WebRTC Lib 的话,我的建议是基于libwebrtc[9],按需进行少许修改,虽然这并不容易。反之,如果 M60 版本就能满足您的需求的话,我强烈推荐您直接使用libwebrtc[10]

    修改 LibWebRTC

    我的修改版:libwebrtc-m70[11]

    改动内容

    1. Commit1[12]:

      • 因为 WebRTC 内部文件目录的改变,多了一级 webrtc 目录,所以我们抽取头文件时,也要将这一级目录结构带上,否则引用部分头文件会报错。

      • 删除 install-sysroot.py 的废弃参数(--running-as-hook)

      • 修改默认版本为 M70

    2. Commit2[13]

      • 添加缺少的头文件 abseil-cpp

    3. Commit3[14]

      • 这里我参考了webrtc-builds[15]的方式,用 sed 命令修改了部分 BUILD.gn 文件,添加了_GLIBCXX_USE_CXX11_ABI=0,因为 libwebrtc 在 linux 编译出来的库也有这个参数,所以编译 webrtc 时如果没有这个参数会出现找不到符号的问题。

      • 之后的几次提交修正了脚本路径的问题Commit3.1[16],Commit3.2[17],Commit3.1[18]

    4. Commit4[19]

      • 随后我发现自己的修正 BUILG.gn 执行的顺序总是有问题,没法以参数的形式传递 GN_EXTRA_ARGS 参数,所以我就把业务需要的 GN 参数直接写到了Gn.cmake[20]

      • proprietary_codecs=true use_openh264=true ffmpeg_branding=\"Chrome\" 是开启 H264 编码支持

      • use_custom_libcxx=false use_custom_libcxx_for_host=false 是和上一步类似的编译参数

    如果您也想使用 M70 版本的 WebRTC Lib 可以直接使用我的这个版本,需要注意的是您需要把 GN_EXTRA_ARGS 直接写到Gn.cmake[21]中,这一版在 Mac,Ubuntu,CentOS 上都可以正常编译使用。如果您需要更高版本的 WebRTC Lib 可以基于我的版本进行修改。

    修改经验

    • 编译问题主要还是集中在 Linux 系统下,在使用的时候会提示 XXX 符号找不到,如果您遇到了类似情况我建议先根据错误提示,通过nm libwebrtc.a
      看看编译出来的库中有没有类似的符号。如果 libwebrtc.a 中有类似符号,只是返回值或者参数描述有些出入,缺少的符号带'cxx'的话, 比如编译的时候提示缺少'cxx1112basic_stringXXX',实际有的符号是'112basic_stringXXX',那么很可能就是编译的时候没有适配上'_GLIBCXX_USE_CXX11_ABI=0'。这时候你就需要检查一下这个符号是在哪个模块里定义的,然后效仿Commit3[22],把参数添加到对应的 BUILD.gn 中。

    • '__1__cxx11'相关的符号问题,一般是是 libc++和 libstdc++的问题。

    • 如果提示缺少某些符号,而且 libwebrtc.a 中也没有,那很有可能就是打包的时候漏掉了,那么您需要修改打包模块把漏掉的部分补回来find . -name "*.o" -exec nm -A {} \; | grep "WelsQuant4x4Dc_sse2"
      。头文件找不到也同理。

    • 调试 Gn 参数时,可以使用gn args out/Release --list
      来查看当前的编译参数,以及是哪个文件最终影响了该参数。

    参考内容

    [1]https://stackoverflow.com/questions/47348330/error-linking-webrtc-native-due-to-undefined-reference-to-methods-having-stdst 

    [2]https://www.chromium.org/developers/gn-build-configuration 

    [3]https://github.com/aisouard/libwebrtc 

    [4]https://github.com/sourcey/webrtc-builds

    引用链接

    [1]

    libwebrtc: https://github.com/aisouard/libwebrtc

    [2]

    webrtc-builds: https://github.com/sourcey/webrtc-builds

    [3]

    编译方案: https://webrtc.org/native-code/development/

    [4]

    工具: https://webrtc.org/native-code/development/prerequisite-sw

    [5]

    libwebrtc: https://github.com/aisouard/libwebrtc

    [6]

    webrtc-builds: https://github.com/sourcey/webrtc-builds

    [7]

    libwebrtc: https://github.com/aisouard/libwebrtc

    [8]

    NodeJS WebRTC: https://github.com/node-webrtc/node-webrtc

    [9]

    libwebrtc: https://github.com/aisouard/libwebrtc

    [10]

    libwebrtc: https://github.com/aisouard/libwebrtc

    [11]

    libwebrtc-m70: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70

    [12]

    Commit1: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70/commit/9d8cd776fbbb1d0daa5d0b88ac825f14f7d74c69

    [13]

    Commit2: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70/commit/fdfb2f8212a332e7061bd59934029e6e1c106a78

    [14]

    Commit3: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70/commit/5a6baa1fba83d1eb759545323c5368c37a73eb03

    [15]

    webrtc-builds: https://github.com/sourcey/webrtc-builds

    [16]

    Commit3.1: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70/commit/06a453a2e960d5f30c8f53f33e162f1537946fd8

    [17]

    Commit3.2: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70/commit/61448171a5ae188f72acf46628eb39b87ed4e0ab

    [18]

    Commit3.1: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70/commit/424ed97ba84861f1b301e3c2601ae0771fa241d6

    [19]

    Commit4: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70/commit/e823017ef2feb944265255b7ea016d5d204ca361

    [20]

    Gn.cmake: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70/blob/dev/CMakeModules/Gn.cmake

    [21]

    Gn.cmake: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70/blob/dev/CMakeModules/Gn.cmake

    [22]

    Commit3: https://github.com/BeiKeJieDeLiuLangMao/libwebrtc-m70/commit/5a6baa1fba83d1eb759545323c5368c37a73eb03


    文章转载自贝贝猫技术分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论