0%

VS中引入并使用WebRTC库

banner

前段时间经常有同学问我,如何在Windows下利用编译出的WebRTC库开发自己的应用程序,当时特别忙就让同学到网上找答案了,没想到过了几天同学们又来问,说网上找不到……

相对于移动端,在Windows下使用WebRTC库确实困难些。在移动端(iOS、Andorid),你可以直接从Google提供的Pod库中拉取编译好的WebRTC库,而在Windows端则需要我们自己编译WebRTC库,并导出WebRTC头文件。

这几天手头的工作终于忙的差不多了,今天就花点时间整理一下这方面的知识,给同学们搭个台阶,让同学们快尽入手WebRTC:)。

安装开发环境

在Windows下开发应用程序最常用的开发工具还是Visual Studio,你可以使用VS2019,也可以使用VS2022,目前我还是建议大家先用 VS2019,再等个半年、一年的换VS2022比较合适。VS2019的下载地址在这里,将 VS Installer下载好后,在CMD窗口中执行下面的命令即可。

1
2
3
4
$ PATH_TO_INSTALLER.EXE ^
--add Microsoft.VisualStudio.Workload.NativeDesktop ^
--add Microsoft.VisualStudio.Component.VC.ATLMFC ^
--includeRecommended

当然,正常情况下你在配置WebRTC编译环境时就应该已经将VS安装好了。

编译WebRTC

开发环境安装好后,下面我们就该编译WebRTC源码了。WebRTC源码的下载与编译请看这篇文章

需要注意的是,我们在新项目中引入的WebRTC库,不能直接用下面的命令进行编译:

1
2
gn gen out/Default
ninja -C out/Default

而必须明确指明编译出的WebRTC是Debug版本,还是Release版本;是x86版本还是x64版本……

因此,应该使用下面的命令编译WebRTC:

1
2
gn gen --target=x64 --ide=vs2019 --args="is_debug=true rtc_enable_protobuf=false is_clang=false target_cpu=\"x64\"  enable_iterator_debugging=true  use_custom_libcxx=false symbol_level=0 rtc_include_tests=false" out/debug_x64
ninja - C out/debug_x64

上述 gn 中的几个参数含义如下:

  • –target,顾名思义,生成x64版本的WebRTC库
  • –ide,生成VS工程文件
  • –args,编译时的一些配置参数
    • is_debug,为true编译出Debug版本;为false编译出Release版本
    • rtc_enable_protobuf,是否使用protobuf,使用可将其设置为true
    • use_custom_libcxx,WebRTC默认使用的是libc++库,而我们在Windows上使用的是libstdc++库,所以需要将其设置为false
    • symbol_level,编译出的WebRTC库是否带符号表,这个数据量很大,会影响运行速度,所以一般设置为0,表示编译出的WebRTC不带符号表
    • rtc_include_tests,编译WebRTC时是否编译测试用例,如果为false则不编译,这样可以大大加快WebRTC的编译速度

执行上面的命令时,会花一些时间,因此我们需要让子弹飞一会儿……

构建自己的应用程序

如果顺利的话,你现在应该已经将WebRTC库编译好了。接下来我们来创建自己的应用程序。

为了方便,你可以将WebRTC examples中的peerconnection_client代码拿出来构建一个新的工程,之后再将前面编译好的WebRTC库引入进来,如果它可以正常运行就达到了我们的目标

为了达到这个目标,首先我们先使用VS创建一个空项目,步骤如下:

  • 第一步,打开Visual Studio,创建新项目
    图1
  • 第二步,使用Windows桌面向导创建Windows空项目
    图2
  • 第三步,填写项目名称,并将项目与解决方案放在同一目录下
    图3
  • 第四步,选择应用程序类型为桌面应用程序
    图4
  • 第五步,同时勾选空项目
    图5

至此,我们就构建出了一个VS空项目,它里边没有任何文件,如下图所示:

图6

空项目创建好后,紧接着我们来移植peerconnection_client代码到新项目中,步骤如下:

  • 第一步,从WebRTC源码中拷贝peerconnection_client中的代码到新项目的目录中,在我这里是
    C:\webrtc\webrtc-checkout\src\exmaples\peerconnection\client目录中的代码拷贝到C:\Users\lichao\sourceMyWebRTCDemo目录下。如下图所示:

    code1

    code2

  • 第二步,将新项目中的代码到VS项目中
    code3

通过以上步骤我们就将peerconnection_client中的代码移植好了。接下来咱们来看重头戏,如何在项目中引入WebRTC库。

引入WebRTC库

通常我们引入一个外部库只需要两步,引入库文件和其头文件。不过,对于WebRTC,更准确的说对于peerconnection_client而言,它需要的不仅仅是WebRTC库,还需要将WebRTC依赖的第三方库加进来,这是大家觉得在Windows下使用WebRTC库比较麻烦的原因。

下面咱们就来看一下如何引入WebRTC库吧!

添加依赖的头文件

我们若想将WebRTC头文件引入到项目中,可以通过下面两种方法引入:

  • 方法一,在VS中将WebRTC源码路径添加到附加包含目录中。比如我这里将WebRTC源码下载到了C:\webrtc\webrtc-checkout\src目录下,我只需将该路径添加到:

    1
    项目 -> 属性 -> C/C++ -> 常规 -> 附加包含目录

    中即可,如下图所示:
    setting1

    这种方法的好处是简单方便,坏处是不便于我们将库文件发布给别人使用。

  • 方法二,我们可以通过这个脚本将WebRTC中的头文件提取出来。之后与方法一一样,将头文件路径添加到附加包含目录中即可。

    需要注意的是,这个脚本下载后,要将其放到WebRTC源码目录src的同级目录中,如下图所示:
    script1

    之后打开Windows控制台,并进入到src的同级目录中,在CMD窗口中执行extract_webrtc_headers.bat脚本,这样就可以将WebRTC头文件提取出来了,如下图所示:
    script2

    这种方法的优点是方便其他人使用,缺点是抽取头文件需要花一些时间。

除了添加上面的头文件路径外,我们还需要将下面几个路径添加到附加包含项目中:

1
2
3
4
C:\webrtc\webrtc-checkout\src\third_party\jsoncpp\generated
C:\webrtc\webrtc-checkout\src\third_party\jsoncpp\source\include
C:\webrtc\webrtc-checkout\src\third_party\libyuv\include
C:\webrtc\webrtc-checkout\src\third_party\abseil-cpp

添加依赖的库

头文件添加好后,接下来咱们来添加WebRTC库文件。WebRTC编译好后,你可以在WebRTC源码目录srcout/debug_x64/obj目录下找到WebRTC.lib文件,这就是编译好的WebRTC库。

我们将它添加到VS中的附加库目录中,具体操作如下:

1
右键项目 -> 属性 -> 链接器 -> 常规 -> 附加库目录

WebRTC库文件路径添加好后,如下图所示:
linker1

接着咱们添加具体的的依赖库,添加依赖库的位置在:

1
右键项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项

如下图所示:
linker2

具体都依赖哪些依赖项呢?这里我以 M93(4577) 为例,对于这个版本的peerconnection_client来说,它需要下面的依赖库:

  • WebRTC相关的库包括:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    third_party/abseil-cpp/absl/flags/marshalling/marshalling.obj
    third_party/abseil-cpp/absl/flags/program_name/program_name.obj
    third_party/abseil-cpp/absl/flags/flag/flag.obj
    third_party/abseil-cpp/absl/flags/flag_internal/flag.obj
    third_party/abseil-cpp/absl/flags/commandlineflag/commandlineflag.obj
    third_party/abseil-cpp/absl/flags/commandlineflag_internal/commandlineflag.obj
    third_party/abseil-cpp/absl/flags/private_handle_accessor/private_handle_accessor.obj
    third_party/abseil-cpp/absl/flags/reflection/reflection.obj
    third_party/abseil-cpp/absl/flags/parse/parse.obj
    third_party/abseil-cpp/absl/flags/usage/usage.obj
    third_party/abseil-cpp/absl/flags/usage_internal/usage.obj
    third_party/abseil-cpp/absl/flags/config/usage_config.obj
    third_party/jsoncpp/jsoncpp/json_reader.obj
    third_party/jsoncpp/jsoncpp/json_value.obj
    third_party/jsoncpp/jsoncpp/json_writer.obj
    test/field_trial/field_trial.obj
    test/video_test_common/test_video_capturer.obj
    test/platform_video_capturer/vcm_capturer.obj
    rtc_base/rtc_json/json.obj
  • 系统相关的库包括:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    advapi32.lib
    comdlg32.lib
    dbghelp.lib
    dnsapi.lib
    gdi32.lib
    msimg32.lib
    odbc32.lib
    odbccp32.lib
    oleaut32.lib
    shell32.lib
    shlwapi.lib
    user32.lib
    usp10.lib
    uuid.lib
    version.lib
    wininet.lib
    winmm.lib
    winspool.lib
    ws2_32.lib
    delayimp.lib
    kernel32.lib
    ole32.lib
    crypt32.lib
    iphlpapi.lib
    secur32.lib
    dmoguids.lib
    wmcodecdspuuid.lib
    amstrmid.lib
    msdmo.lib
    strmiids.lib

添加宏

除了上面讲的需要引入头文件和WebRTC库之外,还需要添加下面这些宏。这些宏的具体含义我有不介绍了,有兴趣的同学可以自己在网上搜索一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
USE_AURA=1
_HAS_NODISCARD
_HAS_EXCEPTIONS=0
__STD_C
_CRT_RAND_S
_CRT_SECURE_NO_DEPRECATE
_SCL_SECURE_NO_DEPRECATE
_ATL_NO_OPENGL
_WINDOWS
CERT_CHAIN_PARA_HAS_EXTRA_FIELDS
PSAPI_VERSION=2
WIN32
_SECURE_ATL
WINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP
WIN32_LEAN_AND_MEAN
NOMINMAX
_UNICODE
UNICODE
NTDDI_VERSION=NTDDI_WIN10_VB
_WIN32_WINNT=0x0A00
WINVER=0x0A00
_DEBUG
DYNAMIC_ANNOTATIONS_ENABLED=1
WEBRTC_ENABLE_PROTOBUF=0
WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE
RTC_ENABLE_VP9
WEBRTC_HAVE_SCTP
WEBRTC_ENABLE_AVX2
RTC_ENABLE_WIN_WGC
WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0
WEBRTC_WIN
ABSL_ALLOCATOR_NOTHROW=1
_ENABLE_EXTENDED_ALIGNED_STORAGE
ABSL_FLAGS_STRIP_NAMES=0
HAVE_WEBRTC_VIDEO

添加方法如下:

  • 首先在 VS 中执行下面的操作,

    1
    右键项目 -> 属性 -> C/C++ -> 预处理器
  • 之后将上面的宏添加到预处理器中即可。

编译运行

到此为止,我们就将peerconnection_client的代码移植好了,直接点测试一下吧!

此时,编译器有可能报4996的错误,解决该问题办法很简单,只要在

1
右键项目项 -> 属性 -> C/C++ -> 高级 -> 禁用特定警告

中将 4996 添加进去即可。除此之外,还有可能遇到 /MDd 错误,解决它可以通过在

1
右键项目项 -> 属性 -> C/C++ -> 代码生成 -> 运行库

中将 /MDd 改为 /MTd 即可。

如果一切顺利,peerconnection_client的连接窗口就展示在你面前了,如下图所示。

此时,你需要先将peerconnection_server程序运行起来,让它侦听 8888 端口;之后在peerconnection_client的连接界面中输入 127.0.0.1,点击连接,如果能进入列表界面就表明OK了。

小结

上面我详细的向你介绍了如何将WebRTC中的peerconnection_client代码移植出来,并重点向你讲解了如何在项目中引入WebRTC库。

其重点包括三步:一是添加WebRTC库头文件路径;二是添加WebRTC库路径,及其WebRTC库;三是添加一堆宏。只要将上面三个步骤操作好了,其它的一些问题在网上都能找到答案。

祝大家好运!

欢迎关注我的其它发布渠道