Skip to main content

在Window平台上编译libmediasoupclient

· 6 min read
luke
luke

在Window平台如何编译libmediasoupclient和webrtc

前言

由于想创建一个会议或者直播的Demo,所以才来研究一下mediasoup,已经在云服务器上配置完成了mediasoup,已通过终端测试可以进入同一个房间。 之后想使用libmediasoupclient 配合 Qt 完成一个简单的会议功能的软件,主要用于学习和了解mediasoup和WebRTC。

需要的和需要完成的

  • WebRTC : 想要编译libmediasoupclient,那么WebRTC是必须要编译的,而WebRTC作为Google开源的库则需要使用depot_tools 编译工具集
  • depot_tools : Google
  • libmediasoupclient :

depot_tools 工具集的安装

工具集是需要git工具的,需要先安装git
https://git-scm.com/install/windows

从谷歌官方地址下载 depot_tools

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

depot_tools 是一套Python脚本工具,不需要编译。
设置depot_tools 环境变量 设置系统环境变量 Path 增加一个 depot_tools的目录

WebRTC编译

打开PowerShell 寻找一个合适的地方创建一个目录 webrtc

cd webrtc

配置webrtc源码库

gclient config --name src https://webrtc.googlesource.com/src.git 

配置指定的分支代码

https://webrtc.googlesource.com/src.git@refs/branch-heads/7339

初次安装git可能会遇到没有配置 gitconfig情况
可以先进行配置,不需要账户

git config --global user.name "example"
git config --global user.email "example@163.com"
git config --global core.autocrlf false
git config --global core.filemode false
git config --global core.fscache true
git config --global core.preloadindex true
git config --global depot-tools.allowGlobalGitConfig true

同步源码

gclient sync

同步代码,代码很大,耐心等待

如果使用的是仓库是https://chromium.googlesource.com/webrtc.git 可以使用下面的命令来获取指定分支信息

#可以查询所有的分支
git ls-remote https://webrtc.googlesource.com/src.git refs/branch-heads/*
cd src
git fetch origin refs/branch-heads/7339
git checkout branch-heads/7339
#重新同步安装依赖
cd ..
gclient sync

更换分支之后 建议使用 gclient sync -D 这样会将不用依赖删除
并且设置一个DEPOT_TOOLS_WIN_TOOLCHAIN变量 来使用本地的编译环境,这样就不会从下载了

set DEPOT_TOOLS_WIN_TOOLCHAIN=0 #此设置需要在cmd中执行 
$env:DEPOT_TOOLS_WIN_TOOLCHAIN = "0" #此命令可以在powershell中执行
VS2022安装时需要安装WindowSDK 10 / 11 (10.0.22621.0)

编译

生成工程文件

编译首先需要生成工程文件。WebRTC默认使用Ninja作为编译系统,Ninja工程文件通过GN生成,由于我们需要使用VS进行代码编辑调试等,所以使用GN生成Ninja工程时需要配置--ide=vs生成VS的工程文件。 通过如下命令生成工程文件(Debug编译,工程文件位于out\Default目录下)

cd src
# gn gen --ide=vs2022 out/Debug --args="is_debug=true target_os=\"win\" target_cpu=\"x64\"" #按需引导
gn gen --ide=vs2022 out/Default
#如果需要release编译 则需要
gn gen --ide=vs2022 out/Default --args="is_debug=false"
#如果不想使用默认编译参数,可以使用gn args out/Default --list查看当前编译参数
gn gen --ide=vs2022 out/Default --args="use_rtti=true is_clang=false rtc_build_tools=false rtc_include_tests=false rtc_build_examples=false"

输出如下就是成功了

Generating Visual Studio projects took 5678ms
Generating compile_commands took 380ms
Done. Made 2575 targets from 382 files in 25323ms

工程文件编译

生成工程文件后,有两种方式构建工程

使用命令方式

就可以在src目录下执行编译命令:

cd src
ninja -C out/Default
使用visual studio 打开

其中 nijia需要配置环境变量 ninja --version where ninja

libmediasoupclient

版本需要匹配

libmediasoupclient: webrtc-m140
webrtc: branch-heads/7339

使用如下的命令生成sln文件,进行编译

cmake . -Bbuild   -DLIBWEBRTC_INCLUDE_PATH:PATH=D:\\work\\webrtc\\src   -DLIBWEBRTC_BINARY_PATH:PATH=D:\\work\\webrtc\\src\\out\\Release\\obj   -DCMAKE_TOOLCHAIN_FILE:PATH=D:\\work\\vcpkg\\scripts\\buildsystems\\vcpkg.cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5

demo

libmediasoupclient 在webrtc源码中有个demo,但是时macOS平台的需要修改才行

我最终使用如下命令创建的sln文件

cmake . -Bbuild -DLIBWEBRTC_INCLUDE_PATH=D:/work/webrtc/src -DLIBWEBRTC_BINARY_PATH=D:/work/webrtc/src/out/Release/obj -DMEDIASOUPCLIENT_BUILD_DEMO=ON -DCMAKE_TOOLCHAIN_FILE=D:\work\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows -DMBEDTLS_INCLUDE_DIRS=D:/work/vcpkg/installed/x64-windows/include -DMBEDTLS_LIBRARY=D:/work/vcpkg/installed/x64-windows-static/lib/mbedtls.lib -DMBEDX509_LIBRARY=D:/work/vcpkg/installed/x64-windows-static/lib/mbedx509.lib -DMBEDCRYPTO_LIBRARY=D:/work/vcpkg/installed/x64-windows-static/lib/mbedcrypto.lib -DZLIB_INCLUDE_DIR=D:/work/vcpkg/installed/x64-windows/include -DZLIB_LIBRARY=D:/work/vcpkg/installed/x64-windows/lib/z.lib

修改完成后的CMakeLists.txt

cmake_minimum_required(VERSION 3.14)

include(FetchContent)


# C++ standard requirements.
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# nlohmann/json - 必须在 ProtooClient 之前
message(STATUS "\nFetching nlohmann/json...\n")
FetchContent_Declare(
json
GIT_REPOSITORY https://github.com/nlohmann/json.git
GIT_TAG v3.11.2
)
FetchContent_MakeAvailable(json)

# ixwebsocket — WebSocket client with TLS support
message(STATUS "\nFetching ixwebsocket...\n")


FetchContent_Declare(
ixwebsocket
GIT_REPOSITORY https://github.com/machinezone/IXWebSocket.git
GIT_TAG v11.4.5
)
set(IXWEBSOCKET_USE_MBED_TLS_MIN_VERSION_3 ON CACHE BOOL "Use mbedTLS v3.x" FORCE)
set(USE_TLS ON CACHE BOOL "Enable TLS in ixwebsocket" FORCE)
FetchContent_MakeAvailable(ixwebsocket)

# CLI11 — command-line argument parsing
message(STATUS "\nFetching CLI11...\n")
FetchContent_Declare(
cli11
GIT_REPOSITORY https://github.com/CLIUtils/CLI11.git
GIT_TAG v2.4.2
)
FetchContent_MakeAvailable(cli11)

# 源文件 - Windows 使用 CaptureVideoSource.hpp 而不是 AVF
set(DEMO_SOURCES
src/ProtooClient.cpp
src/RoomClient.cpp
src/main.cpp
include/ProtooClient.hpp
include/RoomClient.hpp
)

if(APPLE)
list(APPEND DEMO_SOURCES src/AVFCaptureVideoSource.mm include/AVFCaptureVideoSource.hpp)
else()
list(APPEND DEMO_SOURCES src/CaptureVideoSource.hpp)
endif()

add_executable(mediasoupclient_demo ${DEMO_SOURCES})

target_compile_definitions(mediasoupclient_demo PRIVATE
$<$<PLATFORM_ID:Windows>:NOMINMAX>
$<$<PLATFORM_ID:Windows>:WIN32_LEAN_AND_MEAN>
$<$<PLATFORM_ID:Windows>:WEBRTC_WIN>
NDEBUG
)

target_include_directories(mediasoupclient_demo PRIVATE
include
${mediasoupclient_SOURCE_DIR}/include
../include
${LIBWEBRTC_INCLUDE_PATH}
${LIBWEBRTC_INCLUDE_PATH}/third_party/libyuv/include
${LIBWEBRTC_INCLUDE_PATH}/third_party/abseil-cpp
${LIBWEBRTC_INCLUDE_PATH}/third_party/abseil-cpp/absl
${LIBWEBRTC_INCLUDE_PATH}/third_party/boringssl/src/include
${json_SOURCE_DIR}/include/nlohmann
${json_SOURCE_DIR}/include
)

if(APPLE)
find_library(APPLICATION_SERVICES ApplicationServices)
find_library(AUDIO_TOOLBOX AudioToolbox)
find_library(AVFOUNDATION AVFoundation)
find_library(CORE_AUDIO CoreAudio)
find_library(CORE_FOUNDATION Foundation)
find_library(CORE_MEDIA CoreMedia)
find_library(CORE_VIDEO CoreVideo)
find_library(SECURITY Security)

target_link_libraries(mediasoupclient_demo PRIVATE
${APPLICATION_SERVICES}
${AUDIO_TOOLBOX}
${AVFOUNDATION}
${CORE_AUDIO}
${CORE_FOUNDATION}
${CORE_MEDIA}
${CORE_VIDEO}
${SECURITY}
)

set_target_properties(mediasoupclient_demo PROPERTIES
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist
)
endif()

if(UNIX)
find_package(Threads REQUIRED)
target_link_libraries(mediasoupclient_demo PRIVATE Threads::Threads)
endif()

# 为特定目标添加库搜索路径
target_link_directories(mediasoupclient_demo PRIVATE
D:/work/libmediasoupclient/build/Release
)

if(MSVC)
# 1. 统一运行时为 /MT
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Release>:Release>")
endif()

target_link_libraries(mediasoupclient_demo PRIVATE
mediasoupclient
ixwebsocket
CLI11::CLI11
${CMAKE_DL_LIBS}
winmm # timeGetTime, timeBeginPeriod, timeEndPeriod
ws2_32 # socket
ole32 # COM
oleaut32 # COM
bcrypt # BCryptGenRandom
crypt32 # 加密
secur32 # 安全
iphlpapi # GetAdaptersAddresses
strmiids # CLSID_CWMAudioAEC, IID_IMediaObject
dmoguids # 更多 DMO GUIDs
wmcodecdspuuid # Windows Media 编解码器
mfuuid # Media Foundation
legacy_stdio_definitions # ← 添加这个
#ucrt # ← UCRT (Universal C Runtime)
#vcruntime # ← VS C++ 运行时
oldnames
mfuuid
msdmo
mfplat
)

# libwebrtc is added after add_subdirectory in the parent scope,
# so we link it explicitly here.
target_link_libraries(mediasoupclient_demo PUBLIC
${LIBWEBRTC_BINARY_PATH}/webrtc${CMAKE_STATIC_LIBRARY_SUFFIX}
)

使用以上命令生成的工程 使用Release版本
博主的webrtc,libmedisoupclient,libsdptransform,和其相关的库均使用MT Release进行编译

.\mediasoupclient_demo.exe   --ws-url    wss://vectel.cn:4443   --origin https://vectel.cn:4443

遗留问题

客户端第一个进入会议,当其他参与者进入会议室,处理音频订阅时,麦克风突然关闭了。未排查到原因。
使用自采集依然无法解决,只是随后会迅速恢复,目前只是不影响使用。