美文网首页程序员
Linux下编译WebRTC(Linux和Android版本)

Linux下编译WebRTC(Linux和Android版本)

作者: 拉普拉斯妖kk | 来源:发表于2021-12-11 17:15 被阅读0次

    前言

    随着新冠疫情的影响,这两年音视频的需求呈爆发式增长。在音视频领域中,WebRTC可以说是一个绕不开宝库,包括了音视频采集、编解码、传输、渲染的全过程。本文主要记录下在Linux平台上编译WebRTC Linux和Android版本的全过程。

    需要首先说明的是官方推荐编译使用的Linux系统是Ubuntu,因为WebRTC主要是在Ubuntu下开发的。

    设置代理

    因为众所周知的原因,要下载WebRTC的源码是需要代理工具的。

    export http_porxy="http://127.0.0.1:7777"
    export https_porxy="http://127.0.0.1:7777"
    

    安装工具depot_tools

    git clone获取depot_tools

    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    

    将depot_tools的路径配置到环境变量中

    echo "export PATH=$PWD/depot_tools:$PATH" > ~/.bashrc
    source ~/.bashrc
    

    下载webrtc源码

    从这里开始Linux和Android版本的命令就有写区别了。

    Linux版本:

    mkdir webrtc
    cd webrtc
    fetch --nohooks webrtc
    gclient sync
    

    Android版本:

    mkdir webrtc
    cd webrtc
    fetch --nohooks webrtc_android
    gclient sync
    

    默认下载的是最新的源码,如果想要切换到指定分支,可以使用以下命令:

    # 查看可用版本分支
    git branch -r
    # 切换到m79分支
    git checkout branch-heads/m79
    gclient sync
    # 或者强制切换到指定commit(b484ec0082948ae086c2ba4142b4d2bf8bc4dd4b是m79最后一次提交的commit id)
    gclient sync -r b484ec0082948ae086c2ba4142b4d2bf8bc4dd4b --force
    

    可以在从这里获取webrtc所有release版本的信息

    安装编译依赖

    获取到webrtc源码后需要执行几个脚本来安装编译依赖。

    Linux版本:

    cd src
    ./build/install-build-deps.sh
    

    Android版本:

    cd src
    ./build/install-build-deps.sh
    ./build/install-build-deps-android.sh
    source build/android/envsetup.sh
    

    编译

    Linux版本:

    默认情况下,Linux 下基于 ninja 编译的话,其编译器使用的是 clang,且其依赖的 stdc 标准库为其 ./buildtools/third_party/libc++ 内置的,所以如果外部想要基于 clang 编译的 libwebrtc.a 进行开发的话,上层依然需要使用 clang 做为编译器,且链接 webrtc 内部的 libc++ 标准库,否则将会产生各种 error: undefined reference to symbol ...,无法解决。

    # clang编译x64版
    gn gen out/Release-clang --args='target_os="linux" target_cpu="x64" is_debug=false is_component_build=false rtc_include_tests=false rtc_build_examples=false'
    ninja -C out/Release-clang
    # gcc编译x64版
    gn gen out/Release-gcc --args='target_os="linux" target_cpu="x64" is_debug=false is_component_build=false use_sysroot=false is_clang=false use_lld=false treat_warnings_as_errors=false rtc_include_tests=false rtc_build_examples=false use_custom_libcxx=false use_rtti=true'
    ninja -C out/Release-gcc
    # gcc编译arm64版(需要先安装编译工具)
    build/linux/sysroot_scripts/install-sysroot.py --arch=arm64
    gn gen out/Release-arm64 --args='target_os="linux" target_cpu="arm64" is_debug=false is_component_build=false use_sysroot=false is_clang=false use_lld=false treat_warnings_as_errors=false rtc_include_tests=false rtc_build_examples=false use_custom_libcxx=false use_rtti=true'
    ninja -C out/Release-arm64
    

    编译成功后,在out/xxx//obj文件夹下生成静态库——libwebrtc.a。

    Android版本:

    # 编译arm-v7版
    gn gen out/Release-arm-v7a --args='target_os="android" target_cpu="arm" is_debug=false rtc_include_tests=false rtc_build_examples=false'
    ninja -C out/Release-arm-v7a
    # 编译arm-v8版
    gn gen out/Release-arm-v8a --args='target_os="android" target_cpu="arm64" is_debug=false rtc_include_tests=false rtc_build_examples=false'
    ninja -C out/Release-arm-v8a
    

    编译成功后,在out/xxx/lib.java/sdk/android中生成jar包——libwebrtc.jar,在out/xxx中生成Android使用的静态库——libjingle_peerconnection_so.so。

    Android中也可以直接编译aar包:

    ./tools_webrtc/android/build_aar.py --build-dir out --arch "armeabi-v7a" "arm64-v8a"
    

    编译成功后,在/src目录下生成——libwebrtc.aar ,包含了 armeabi-v7a、arm64-v8a 两种架构的so。

    提取webrtc项目中的所有头文件

    find . -maxdepth 1 -name "*.h" -exec cp --parents '{}' /home/xxx/workspace/webrtc/include ';' && find api audio base call common_audio common_video logging media modules p2p pc rtc_base rtc_tools sdk stats system_wrappers third_party video -name "*.h" -exec cp --parents '{}' /home/xxx/workspace/webrtc/include ';'
    

    相关文章

      网友评论

        本文标题:Linux下编译WebRTC(Linux和Android版本)

        本文链接:https://www.haomeiwen.com/subject/yenkfrtx.html