在 Linux 平台下开发实时通话 SDK 其实是主要应用于未来的 IOT 行业,先基于 Ubuntu 作为开发平台,完成后再基于每个客户提供的其交叉编译工具链进行交叉编译以供用户使用。

1、基于 Ubuntu 下载 webrtc

1.1 自行下载编译

如果是自己下载编译的话,可以参考官方教程,或者参考本人之前的一篇博客: https://www.jianshu.com/p/09f065f3feb0 ,其实 Ubuntu 下编译 webrtc 是比较简单的,只要可以翻墙,其它都只是时间问题了。

1.2 国内网络问题无法自行下载

那么可以通过下载本人配置的一个 Docker 镜像进行进行编译: https://hub.docker.com/r/cgb0210/ubuntu_build ,由于 Docker 不适合作为开发环境,下载后,建议用户将 develop 目录下的文件拷贝到自己的开发环境中,并参考 https://www.jianshu.com/p/09f065f3feb0 配置相关环境变量,实现本地编译,过程主要包含 3 步:

1.3 配置 depot_tools 环境变量

export PATH=$PATH:/home/gobert/develop/depot_tools/etc/profile

1.4 安装 GoLang 并配置环境

1.5 安装 Linux 依赖包

/build/install-build-deps.shsudo sh build/install-build-deps.sh

2、编译 webrtc

error: undefined reference to symbol ...

2.1 RTTI (Run-Time Type Identification 运行时类型识别)

undefined reference to错误,为此我们可以在链接 libwebrtc.a 的根编译脚本文件中配置统一去除 rtti 属性,以解决此类问题,打开根目录下的 BUILD.gn 文件,在尾部添加
if (!build_with_chromium) {
# Target to build all the WebRTC production code.
rtc_static_library("webrtc") {
    
    ...
    
    cflags_cc = [" -fno-rtti" ]
    }
}
typeinfo for [classname]'

2.2 找不到 builtin_audio_decoder_factory 模块的所有符号

builtin_audio_decoder_factoryaudio/BUILD.gn"../api/audio_codecs:builtin_audio_encoder_factory","../api/audio_codecs:builtin_audio_decoder_factory",

2.3 编译

编译命令如下:

gn gen -C out/Linux/Release  --args="is_debug=false target_cpu=\"x64\" rtc_include_tests=false rtc_use_h264=true rtc_initialize_ffmpeg=true ffmpeg_branding=\"Chrome\" is_component_build=false"
rtc_include_tests=falsertc_use_h264=true rtc_initialize_ffmpeg=true ffmpeg_branding=\"Chrome\"

3、Demo 程序

3.1 编译测试程序加载并调用 webrtc 接口。

#include <stdio.h>
#include <string>

#include "api/jsep.h"

using namespace std;
using namespace webrtc;

int main(int argc, char const *argv[])
{
    SdpParseError error;
    auto ptr = CreateSessionDescription("offer", "sdp", &error);
    
    if (!ptr) {
        printf("CreateSessionDescription return null, error str:%s\n", error.description.c_str());
    } else {
        printf("CreateSessionDescription success!\n");
    }

    return 0;
}

3.2 编写 CMakeLists.txt 脚本文件

cmake_minimum_required(VERSION 3.5)
project(demo)

set(CMAKE_POSITION_INDEPENDENT_CODE     TRUE)

set(CMAKE_C_FLAGS               "${CMAKE_C_FLAGS}")
SET(CMAKE_CXX_FLAGS             "${CMAKE_CXX_FLAGS} -fno-exceptions -fPIC")
set(CMAKE_SHARED_LINKER_FLAGS   "${CMAKE_SHARED_LINKER_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS      "${CMAKE_EXE_LINKER_FLAGS}")

set(ARCH_PATH linux)
set(WEBRTC_PATH "/home/gobert/develop/webrtc/src")
set(WEBRTC_LIBRARY_PATH "/home/gobert/develop/webrtc/src/out/Linux/Release/obj")

add_definitions(
    "-DWEBRTC_POSIX"
    "-DWEBRTC_LINUX"
    "-DUSE_GLIB=1"
)

if (Linux)
set(ARCH_PATH linux)
elseif (Arm)
set(ARCH_PATH arm)
endif ()

include_directories(
    ${WEBRTC_PATH}
    )

set(SOURCE_FILES
    main.cpp
)

link_directories(
    ${link_directories}
    ${WEBRTC_PATH}/out/Linux/Release/obj
    /usr/lib/x86_64-linux-gnu/
)

link_libraries(
    "${WEBRTC_LIBRARY_PATH}/libwebrtc.a"
    )

add_executable(demo ${SOURCE_FILES})

TARGET_LINK_LIBRARIES(demo pthread stdc++)

set_target_properties(demo PROPERTIES OUTPUT_NAME "demo")

3.3 编译

cmake && make