9

在 macOS 12.2.1(Apple M1)/Xcode 13.2.1(MacOSX12.1.sdk) 下编译 libmediasoupclient

 2 years ago
source link: http://blog.tubumu.com/2022/03/11/mediasoup-02/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在 macOS 12.2.1(Apple M1)/Xcode 13.2.1(MacOSX12.1.sdk) 下编译 libmediasoupclient

发表于

2022-03-11 分类于 Mediasoup

一、代理设置

export http_proxy=http://127.0.0.1:8001
export https_proxy=http://127.0.0.1:8001

export ALL_PROXY=socks5://127.0.0.1:1080 好像不行。另,没试过 export ALL_PROXY=http://127.0.0.1:8001

二、WebRTC 源码下载

cd /Users/alby/Workspace/OpenSource/webrtc
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=$(pwd)/depot_tools:$PATH

mkdir webrtc-checkout
cd webrtc-checkout

fetch --nohooks webrtc_ios # 注意,对于 macOS 和 iOS 都是 webrtc_ios。即,既不是 webrtc 也不是 webrtc_mac 。
gclient sync

cd src
git checkout -b m94 refs/remotes/branch-heads/4606
gclient sync

三、WebRTC 编译

cd /Users/alby/Workspace/OpenSource/webrtc/webrtc-checkout/src
gn gen out/m94 --args='is_debug=false is_component_build=false is_clang=true rtc_include_tests=false rtc_use_h264=true use_rtti=true mac_deployment_target="10.11" use_custom_libcxx=false rtc_build_tools=false rtc_build_examples=true'

ninja -C out/m94

注意,mac_deployment_target="10.11"。尝试用 12.1 等会失败,因为 WebRTC 使用了一些在高版本已经弃用的接口。

四、libmediasoupclient 源码下载

cd /Users/alby/Workspace/OpenSource/webrtc
git clone https://github.com/versatica/libmediasoupclient.git

cd libmediasoupclient/
git checkout 3.X.Y.

五、libmediasoupclient 编译

cd /Users/alby/Workspace/OpenSource/webrtc/libmediasoupclient

cmake . -Bbuild \
-DLIBWEBRTC_INCLUDE_PATH:PATH=/Users/alby/Workspace/OpenSource/webrtc/webrtc-checkout/src \
-DLIBWEBRTC_BINARY_PATH:PATH=/Users/alby/Workspace/OpenSource/webrtc/webrtc-checkout/src/out/m94/obj \
-DCMAKE_OSX_DEPLOYMENT_TARGET="10.11"
make -C build/

-DCMAKE_OSX_DEPLOYMENT_TARGET="10.11",最好和编译 WebRTC 时保持一致。

六、mediasoup-broadcaster-demo 编译

cd /Users/alby/Workspace/OpenSource/webrtc
git clone https://github.com/versatica/mediasoup-broadcaster-demo.git
cd mediasoup-broadcaster-demo

cmake . -Bbuild \
-DLIBWEBRTC_INCLUDE_PATH:PATH=/Users/alby/Workspace/OpenSource/webrtc/webrtc-checkout/src \
-DLIBWEBRTC_BINARY_PATH:PATH=/Users/alby/Workspace/OpenSource/webrtc/webrtc-checkout/src/out/m94/obj \
-DOPENSSL_INCLUDE_DIR:PATH=/opt/homebrew/opt/[email protected]/include \
-DCMAKE_USE_OPENSSL=ON

make -C build

如有必要:brew install [email protected]

1、libmediasoupclient 相关

在编译 libmediasoupclient 的过程中如果出现与 #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */ 行有关的错误,将其改为 #define CATCH_TRAP() asm(".inst 0xd4200000")。见https://github.com/versatica/libmediasoupclient/issues/140

2、absl 相关

如果在链接时报类似错误:

Undefined symbols for architecture arm64:
"webrtc::VideoFrame::Builder::set_update_rect(std::__1::optional<webrtc::VideoFrame::UpdateRect> const&)", referenced from:
RtcVideoCapturer::OnFrame(webrtc::VideoFrame const&) in RtcVideoCapturer.o

用命令 nm -A libwebrtc.a | grep set_update_rect | c++filt 查看该方法的符号也是存在的:

libwebrtc.a:video_frame.o: 00000000000006c4 T webrtc::VideoFrame::Builder::set_update_rect(absl::optional<webrtc::VideoFrame::UpdateRect> const&)

webrtc/third_party/abseil-cpp/absl/options.hABSL_OPTION_USE_STD_ANYABSL_OPTION_USE_STD_OPTIONAL ABSL_OPTION_USE_STD_STRING_VIEWABSL_OPTION_USE_STD_VARIANT 四个宏的值改为从 2 改为 0 再重新编译 webrtc:

// ABSL_OPTION_USE_STD_OPTIONAL
//
// This option controls whether absl::optional is implemented as an alias to
// std::optional, or as an independent implementation.
//
// A value of 0 means to use Abseil's implementation. This requires only C++11
// support, and is expected to work on every toolchain we support.
//
// A value of 1 means to use an alias to std::optional. This requires that all
// code using Abseil is built in C++17 mode or later.
//
// A value of 2 means to detect the C++ version being used to compile Abseil,
// and use an alias only if a working std::optional is available. This option
// is useful when you are building your program from source. It should not be
// used otherwise -- for example, if you are distributing Abseil in a binary
// package manager -- since in mode 2, absl::optional will name a different
// type, with a different mangled name and binary layout, depending on the
// compiler flags passed by the end user. For more info, see
// https://abseil.io/about/design/dropin-types.

// User code should not inspect this macro. To check in the preprocessor if
// absl::optional is a typedef of std::optional, use the feature macro
// ABSL_USES_STD_OPTIONAL.

#define ABSL_OPTION_USE_STD_OPTIONAL 0 // 由 2 改为 0

libmediasoupclient v3 Installation
Mac M1 fails to build while building tests


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK