webrtc 代码_编译WebRTC库

引言

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

现有的编译工具

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

实现思路

简单的讲他们都是一系列脚本的集合,遵从Google提供的编译方案,自动地来帮您做以下工作: 1. 下载编译WebRTC所需要的工具 2. 下载代码 3. 根据您的需要切换到对应的分支 3. 根据您指定的脚本参数来设置WebRTC的编译参数 4. 编译代码 5. 打包目标文件 6. 安装库文件

区别

  • libwebrtc: 使用Cmake模块封装各个子功能
  • webrtc-builds: 使用纯Shell脚本实现

我的选择

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

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

target_link_libraries(my-app ${LIBWEBRTC_LIBRARIES})

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

修改LibWebRTC

我的修改版:libwebrtc-m70

改动内容

  1. Commit1:
  • 因为WebRTC内部文件目录的改变,多了一级webrtc目录,所以我们抽取头文件时,也要将这一级目录结构带上,否则引用部分头文件会报错。
  • 删除install-sysroot.py的废弃参数(--running-as-hook)
  • 修改默认版本为M70
  1. Commit2
  • 添加缺少的头文件abseil-cpp
  1. Commit3
  • 这里我参考了webrtc-builds的方式,用sed命令修改了部分BUILD.gn文件,添加了_GLIBCXX_USE_CXX11_ABI=0,因为libwebrtc在linux编译出来的库也有这个参数,所以编译webrtc时如果没有这个参数会出现找不到符号的问题。
  • 之后的几次提交修正了脚本路径的问题Commit3.1,Commit3.2,Commit3.1
  1. Commit4
  • 随后我发现自己的修正BUILG.gn执行的顺序总是有问题,没法以参数的形式传递GN_EXTRA_ARGS参数,所以我就把业务需要的GN参数直接写到了Gn.cmake
  • 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中,这一版在Mac,Ubuntu,CentOS上都可以正常编译使用。如果您需要更高版本的WebRTC Lib可以基于我的版本进行修改。

修改经验

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


  • 本文作者: 贝克街的流浪猫
  • 本文链接:https://www.beikejiedeliulangmao.top/JNI-%E8%B0%83%E8%AF%95%E6%8A%80%E6%9C%AF/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 创作声明: 本文基于上述所有参考内容进行创作,其中可能涉及复制、修改或者转换,图片均来自网络,如有侵权请联系我,我会第一时间进行删除。

7b8f0e83b345a53b4dbcf8046408505c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
webrtc2011.10.17版共57个工程,编译成功的exe、lib、pdb。绿色软件,能运行于xp2,win7,win10等windows。 2019.10.2日,编译成功并正常运行。 压缩包文件清单如下: 2019-10-02 00:39 252,416 common_audio_unittests.exe 2019-10-02 00:39 2,690,048 common_audio_unittests.pdb 2019-10-02 00:38 lib 2019-10-02 00:39 2,996,736 peerconnection_client.exe 2019-10-02 00:39 23,669,760 peerconnection_client.pdb 2019-10-02 00:39 88,576 peerconnection_server.exe 2019-10-02 00:39 1,338,368 peerconnection_server.pdb 2019-10-02 00:28 800,256 protoc.exe 2019-10-02 00:28 8,178,688 protoc.pdb 2019-10-02 00:19 279 ve_win_test.txt 2019-10-02 00:38 2,678,784 vie_auto_test.exe 2019-10-02 00:38 13,863,936 vie_auto_test.pdb 2019-10-02 00:32 2,611,200 vie_win_test.exe 2019-10-02 00:32 16,845,824 vie_win_test.pdb 2019-10-02 00:39 2,220,544 voe_auto_test.exe 2019-10-02 00:39 10,300,416 voe_auto_test.pdb 2019-10-02 00:39 2,000,384 voe_cmd_test.exe 2019-10-02 00:39 10,529,792 voe_cmd_test.pdb 2019-10-02 00:39 2,109,440 voe_ui_win_test.exe 2019-10-02 00:39 14,076,928 voe_ui_win_test.pdb 2019-10-02 00:19 92,570 webrtc_trace.txt 21 个文件 117,344,945 字节 Z:\webrtc20111017_bin\lib 的目录 2019-10-02 00:38 . 2019-10-02 00:38 .. 2019-10-02 00:28 145,474 aec.lib 2019-10-02 00:28 61,886 aecm.lib 2019-10-02 00:28 46,682 agc.lib 2019-10-02 00:28 76,126 apm_util.lib 2019-10-02 00:29 855,972 audio_coding_module.lib 2019-10-02 00:30 139,006 audio_conference_mixer.lib 2019-10-02 00:31 1,179,980 audio_device.lib 2019-10-02 00:31 1,078,194 audio_processing.lib 2019-10-02 00:31 25,194 CNG.lib 2019-10-02 00:38 488,434 expat.lib 2019-10-02 00:30 16,186 G711.lib 2019-10-02 00:31 36,484 G722.lib 2019-10-02 00:32 3,948,624 gtest.lib 2019-10-02 00:32 426,584 iLBC.lib 2019-10-02 00:32 551,580 iSAC.lib 2019-10-02 00:31 374,162 iSACFix.lib 2019-10-02 00:36 1,523,908 jsoncpp.lib 2019-10-02 00:37 22,903,500 libjingle.lib 2019-10-02 00:33 5,646,538 libjingle_app.lib 2019-10-02 00:35 46,563,554 libjingle_p2p.lib 2019-10-02 00:31 949,154 libjpeg.lib 2019-10-02 00:31 2,165,270 libvpx.lib 2019-10-02 00:30 270,256 media_file.lib 2019-10-02 00:32 361,018 NetEq.lib 2019-10-02 00:30 56,872 ns.lib 2019-10-02 00:28 6,688 PCM16B.lib 2019-10-02 00:27 14,517,778 protobuf_full_do_not_use.lib 2019-10-02 00:26 2,182,776 protobuf_lite.lib 2019-10-02 00:30 27,562 resampler.lib 2019-10-02 00:30 1,894,062 rtp_rtcp.lib 2019-10-02 00:30 249,622 spl.lib 2019-10-02 00:30 2,989,818 system_wrappers.lib 2019-10-02 00:32 140,708 test_support.lib 2019-10-02 00:29 744,182 udp_transport.lib 2019-10-02 00:29 50,426 vad.lib 2019-10-02 00:29 3,811,658 video_capture_module.lib 2019-10-02 00:29 2,078,204 video_engine_core.lib 2019-10-02 00:28 278,498 video_processing.lib 2019-10-02 00:30 1,735,840 video_render_module.lib 2019-10-02 00:28 2,119,792 voice_engine_core.lib 2019-10-02 00:28 31,300 webrtc_i420.lib 2019-10-02 00:28 25,826 webrtc_jpeg.lib 2019-10-02 00:28 286,790 webrtc_utility.lib 2019-10-02 00:28 958,326 webrtc_video_coding.lib 2019-10-02 00:30 92,032 webrtc_vp8.lib 2019-10-02 00:30 131,104 webrtc_vplib.lib 46 个文件 124,243,630 字节 所列文件总数: 67 个文件 241,588,575 字节 5 个目录 582,146,048 可用字节

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值