webrtc编译

1、webrtc 编译参数说明

rtc_use_h264=true 打开264的编译宏支持
proprietary_codecs=true 支持H264 codec
ffmpeg_branding=“Chrome” 编译带有 h264 codec版本的ffmpeg,需配合上述2个参数来使能h264支持
is_clang=false配合use_custom_libcxx=false:使用gcc编译,而不是默认的clang
rtc_build_json=true: 编译webrtc 自带的jsoncpp,而不是使用系统安装的版本

注意该配置开启了“use_rtti=true”,默认webrtc是不开启的,这样编译链接的时候不会报typeinfo 的错误,比如
undefined reference to 'typeinfo for rtc::MessageHandler'
当然也可以选择不开启rtti,然后在mediasoup的链接选项中添加 “-fno-rtti”。

use_rtti=true:编译时启用运行时类型信息功能,默认是false,如果为false,那么在我们的测试程序中去集成libwebrtc.a时就会产生连接错误,"typeinfo for rtc::MessageHandler", referenced from:typeinfo for xxxx

is_component_build——是否应用动静运行期库,设置false示意应用动态运行期库,Release版本将对应MT,Debug版将对应MTd。
rtc_build_ssl——是否编译BoringSSL。
rtc_ssl_root——OpenSSL的头文件门路,会被写到生成的ninja文件中。
use_custom_libcxx——是否应用内置的libcxx作为默认的c++规范库。
rtc_libvpx_build_vp9——是否反对vp9的编解码。
symbol_level——符号等级。设置为0能够减小库的大小。
编译webrtc开启H264须要增加编译选项【proprietary_codecs=true rtc_use_h264=true ffmpeg_branding=\”Chrome\” is_clang=true use_lld=false treat_warnings_as_errors=false】(ffmpeg应用vc++编译编译会有问题,因而必须强制应用clang)。
编译webrtc应用外部的openssl须要增加编译选项【rtc_build_ssl=false rtc_ssl_root=\”C:\Program Files\OpenSSL-Win64\include\”】。

2、编译windows
-----------------编译windows-------------------------------
set DEPOT_TOOLS_WIN_TOOLCHAIN=0

set GYP_MSVS_VERSION=2017

gn gen out/h264Debug_32 --ide=vs2017 --args="symbol_level=2 proprietary_codecs=true use_custom_libcxx=false is_clang=true use_lld=false is_debug=true target_cpu=\"x86\" ffmpeg_branding=\"Chrome\" rtc_use_h264=true rtc_include_tests=false treat_warnings_as_errors=false"

ninja -C out/h264Debug_32

gn gen out/h264Debug_64 --ide=vs2017 --args="symbol_level=2 proprietary_codecs=true use_custom_libcxx=false is_clang=true use_lld=false is_debug=true target_cpu=\"x64\" ffmpeg_branding=\"Chrome\" rtc_use_h264=true rtc_include_tests=false treat_warnings_as_errors=false"

ninja -C out/h264Debug_64

gn gen out/h264Release_32 --ide=vs2017 --args="symbol_level=2 proprietary_codecs=true use_custom_libcxx=false is_clang=true use_lld=false is_debug=false target_cpu=\"x86\" ffmpeg_branding=\"Chrome\" rtc_use_h264=true rtc_include_tests=false treat_warnings_as_errors=false"

ninja -C out/h264Release_32

gn gen out/h264Release_64 --ide=vs2017 --args="symbol_level=2 proprietary_codecs=true use_custom_libcxx=false is_clang=true use_lld=false is_debug=false target_cpu=\"x64\" ffmpeg_branding=\"Chrome\" rtc_use_h264=true rtc_include_tests=false treat_warnings_as_errors=false"

ninja -C out/h264Release_64
-----------------编译windows-------------------------------

3、编译android

-----------------编译android-------------------------------

带h264 64位 release
gn gen out/release64_h264 --args="is_debug=false target_os=\"android\" target_cpu=\"arm64\" ffmpeg_branding=\"Chrome\" rtc_use_h264=true proprietary_codecs=true rtc_include_tests=false treat_warnings_as_errors=false rtc_build_examples=false rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false is_clang=true is_component_build=false"
ninja -C out/release64_h264

带h264 32位 release
gn gen out/release32_h264 --args="is_debug=false target_os=\"android\" target_cpu=\"arm\" ffmpeg_branding=\"Chrome\" rtc_use_h264=true proprietary_codecs=true rtc_include_tests=false treat_warnings_as_errors=false rtc_build_examples=false rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false is_clang=true is_component_build=false"
ninja -C out/release32_h264

带h264 64位 debug
gn gen out/debug64_h264 --args="is_debug=true target_os=\"android\" target_cpu=\"arm64\" ffmpeg_branding=\"Chrome\" rtc_use_h264=true proprietary_codecs=true rtc_include_tests=false treat_warnings_as_errors=false rtc_build_examples=false rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false is_clang=true is_component_build=false"
ninja -C out/debug64_h264

带h264 32位 debug
gn gen out/debug32_h264 --args="is_debug=true target_os=\"android\" target_cpu=\"arm\" ffmpeg_branding=\"Chrome\" rtc_use_h264=true proprietary_codecs=true rtc_include_tests=false treat_warnings_as_errors=false rtc_build_examples=false rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false is_clang=true is_component_build=false"
ninja -C out/debug32_h264

带h264 64位 debug 替换本地openssl
gn gen out/debug64_h264 --args="is_debug=true target_os=\"android\" target_cpu=\"arm64\" ffmpeg_branding=\"Chrome\" rtc_use_h264=true proprietary_codecs=true rtc_include_tests=false treat_warnings_as_errors=false rtc_build_examples=false rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false is_clang=true is_component_build=false rtc_build_ssl=false rtc_ssl_root=\"/usr/local/openssl/include\""


-----------------编译android-------------------------------

4、android添加h264解码

-----------------android添加h264解码-----------------
参考 https://www.cnblogs.com/anyrtc/p/15503838.html


--- a/webrtc-checkout/src/third_party/ffmpeg/ffmpeg_generated.gni
+++ b/webrtc-checkout/src/third_party/ffmpeg/ffmpeg_generated.gni
@@ -194,7 +194,7 @@ if ((is_android && current_cpu == "arm" && arm_use_neon) || (is_android && curre
]
}

-if ((is_mac) || (is_win) || (use_linux_config)) {
+if ((is_mac) || (is_win) || (use_linux_config) || (is_android)) {
ffmpeg_c_sources += [
"libavcodec/autorename_libavcodec_hpeldsp.c",
"libavcodec/autorename_libavcodec_videodsp.c",
@@ -231,7 +231,7 @@ if ((current_cpu == "x64" && ffmpeg_branding == "Chrome") || (is_android && curr
]
}

-if ((is_mac && ffmpeg_branding == "Chrome") || (is_win && ffmpeg_branding == "Chrome") || (use_linux_config && ffmpeg_branding == "Chrome") || (use_linux_config && ffmpeg_branding == "ChromeOS")) {
+if ((is_mac && ffmpeg_branding == "Chrome") || (is_win && ffmpeg_branding == "Chrome") || (use_linux_config && ffmpeg_branding == "Chrome") || (use_linux_config && ffmpeg_branding == "ChromeOS") || (is_android && ffmpeg_branding == "Chrome")) {
ffmpeg_c_sources += [
"libavcodec/cabac.c",
"libavcodec/h2645_parse.c",
@@ -453,7 +453,7 @@ if ((is_android && current_cpu == "arm64") || (is_win && current_cpu == "arm64")
]
}

-if ((is_win && current_cpu == "arm64") || (use_linux_config && current_cpu == "arm64")) {
+if ((is_android && current_cpu == "arm64") || (is_win && current_cpu == "arm64") || (use_linux_config && current_cpu == "arm64")) {
ffmpeg_c_sources += [
"libavcodec/aarch64/h264pred_init.c",
"libavcodec/aarch64/hpeldsp_init_aarch64.c",
@@ -545,7 +545,7 @@ if ((use_linux_config && current_cpu == "mips64el" && ffmpeg_branding == "Chrome
]
}

-if ((is_win && current_cpu == "arm64" && ffmpeg_branding == "Chrome") || (use_linux_config && current_cpu == "arm64" && ffmpeg_branding == "Chrome") || (use_linux_config && current_cpu == "arm64" && ffmpeg_branding == "ChromeOS")) {
+if ((is_win && current_cpu == "arm64" && ffmpeg_branding == "Chrome") || (use_linux_config && current_cpu == "arm64" && ffmpeg_branding == "Chrome") || (use_linux_config && current_cpu == "arm64" && ffmpeg_branding == "ChromeOS") || (is_android && current_cpu == "arm64")) {
ffmpeg_c_sources += [
"libavcodec/aarch64/h264chroma_init_aarch64.c",
"libavcodec/aarch64/h264dsp_init_aarch64.c",


--- a/webrtc-checkout/src/third_party/ffmpeg/chromium/config/Chrome/android/arm64/config.h
+++ b/webrtc-checkout/src/third_party/ffmpeg/chromium/config/Chrome/android/arm64/config.h
@@ -808,7 +808,7 @@
#define CONFIG_H263I_DECODER 0
#define CONFIG_H263P_DECODER 0
#define CONFIG_H263_V4L2M2M_DECODER 0
-#define CONFIG_H264_DECODER 0
+#define CONFIG_H264_DECODER 1
#define CONFIG_H264_CRYSTALHD_DECODER 0
#define CONFIG_H264_V4L2M2M_DECODER 0
#define CONFIG_H264_MEDIACODEC_DECODER 0


diff --git a/webrtc-checkout/src/third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/codec_list.c b/webrtc-checkout/src/third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/codec_list.c
old mode 100644
new mode 100755
index 4c1c44c96c..c08ffb0da9
--- a/webrtc-checkout/src/third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/codec_list.c
+++ b/webrtc-checkout/src/third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/codec_list.c
@@ -13,4 +13,5 @@ static const AVCodec * const codec_list[] = {
&ff_pcm_s32le_decoder,
&ff_pcm_u8_decoder,
&ff_libopus_decoder,
+ &ff_h264_decoder,
NULL };
diff --git a/webrtc-checkout/src/third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/parser_list.c b/webrtc-checkout/src/third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/parser_list.c
old mode 100644
new mode 100755
index b1e4dd0061..42215fccc2
--- a/webrtc-checkout/src/third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/parser_list.c
+++ b/webrtc-checkout/src/third_party/ffmpeg/chromium/config/Chrome/android/arm64/libavcodec/parser_list.c
@@ -5,4 +5,5 @@ static const AVCodecParser * const parser_list[] = {
&ff_opus_parser,
&ff_vorbis_parser,
&ff_vp9_parser,
+ &ff_h264_parser,
NULL };

--- a/webrtc-checkout/src/tools_webrtc/libs/generate_licenses.py
+++ b/webrtc-checkout/src/tools_webrtc/libs/generate_licenses.py
@@ -78,6 +78,7 @@ LIB_TO_LICENSES_DICT = {
# Compile time dependencies, no license needed:
'yasm': [],
'ow2_asm': [],
+ 'ffmpeg':['third_party/ffmpeg/LICENSE.md'],
}


-----------------android添加h264解码-----------------

5、android添加rrtr

-----------------android添加rrtr-----------------
参考
记一次WebRTC的调试过程——解决下行丢包场景下的卡顿问题 - 知乎

index 3976a6a1c5..93656ebb6f
--- a/webrtc-checkout/src/media/engine/webrtc_video_engine.cc
+++ b/webrtc-checkout/src/media/engine/webrtc_video_engine.cc
@@ -91,6 +91,7 @@ void AddDefaultFeedbackParams(VideoCodec* codec) {
codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamCcm, kRtcpFbCcmParamFir));
codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamNack, kParamValueEmpty));
codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamNack, kRtcpFbNackParamPli));
+ codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamRrtr, kParamValueEmpty));
if (codec->name == kVp8CodecName &&
webrtc::field_trial::IsEnabled("WebRTC-RtcpLossNotification")) {
codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamLntf, kParamValueEmpty));
ubuntu@ubuntu-virtual-machine:~/workspace/webrtc/webrtc-android-m84/webrtc-checkout$

-----------------android添加rrtr-----------------

6、iOS端 webrtc+h264编译

参考:
Hack WebRTC 32599 - Piasy的博客 | Piasy Blog

webrtc/build_ios_framework.sh at hack_webrtc_32599 · HackWebRTC/webrtc · GitHub

1.首先编译 ffmpeg
参考ffmpeg-ios-build.diff 把iOS端的编译脚本完成,然后使用如下的指令编译

python chromium/scripts/build_ffmpeg.py ios arm64 --branding Chrome -- \
--disable-asm \
--disable-encoders --disable-hwaccels --disable-bsfs --disable-devices --disable-filters \
--disable-protocols --enable-protocol=file \
--disable-parsers --enable-parser=mpegaudio --enable-parser=h264 --enable-parser=hevc \
--disable-demuxers --enable-demuxer=mov --enable-demuxer=mp3 --enable-demuxer=mpegts \
--disable-decoders --enable-decoder=mp3 --enable-decoder=aac --enable-decoder=h264 \
--disable-muxers --enable-muxer=matroska \
--enable-swresample

编译完成后执行如下的脚本:
./chromium/scripts/copy_config.sh
./chromium/scripts/generate_gn.py

2. 开始编译webrtc

// 创建项目,支持 arm64 架构
gn gen out/arm64_h264 --args='target_os="ios" ios_enable_code_signing=false use_xcode_clang=true is_component_build=false is_debug=false target_cpu="arm64" ios_deployment_target="10.0" proprietary_codecs=true ffmpeg_branding="Chrome" rtc_use_h264=true rtc_libvpx_build_vp9=true enable_ios_bitcode=true use_goma=false enable_dsyms=true enable_stripping=true rtc_include_tests=false rtc_build_tools=false rtc_build_examples=false'

// 开始编译
ninja -C out/arm64_h264 webrtc

操作成功后,会生成 libwebrtc.a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值