一、准备
1、在ubuntu14.04 64bit
因为arm-hisiv400-linux是32位的,故需要在该系统安装兼容32位程序运行的库,参考博客
2、webrtc源码
(2019年9月之前的版本,这之后的版本默认是C++14的(由git log可获取该信息),用海思编译器编译会有问题,release版本的分支号branch-heads/m77,这个版本之前的应该都可以。本文使用m77分支)
分支切换命令WebRTC development
git checkout -b hisi_brach refs/remotes/branch-heads/m77
gclient sync //记得翻墙
3、海思平台3516A100 交叉工具链 arm-hisiv400-linux
二、编译
1、在webrtc源码src目录运行以下脚本(可以不用)
#32位arm
./build/linux/sysroot_scripts/install-sysroot.py --arch=arm
【上述不行时可以这样参考这个 网站 下载debain文件系统
sudo apt-get install qemu-user-static debootstrap
cd build/linux/
sudo debootstrap --arch armhf --foreign --include=g++,libasound2-dev,libpulse-dev,libudev-dev,libexpat1-dev,libnss3-dev, trusty rootfs //没有debian_sid_arm-sysroot目录是直接用该名字不用rootfs
mv rootfs debian_sid_arm-sysroot
】
备份与链接
cd build/linux/debian_sid_arm-sysroot
mv lib lib_bak
mv usr usr_bak
sudo ln -s /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/lib lib
sudo ln -s /opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/usr usr
代码变更,否则报错
sed -i -e "s|const auto iter = FindSourceInList(audio_source, &audio_source_list_);|const auto iter = std::find_if(audio_source_list_.begin(), audio_source_list_.end(), [audio_source](const std::unique_ptr<Audio-MixerImpl::SourceStatus> \&p){ return p->audio_source == audio_source; });|" modules/audio_mixer/audio_mixer_impl.cc
3、海思3516A编译
修改src/BUILD.gn文件,在里面添加红框部分,我使用编译自己程序时如果不加这个会在链接时报"未定义的webrtc::CreatePeerConnectionFactory "
#32位arm
gn gen out/linux_Hi3516Arm --args='target_os="linux" target_cpu="arm" arm_arch="armv7-a" arm_tune="cortex-a7" arm_version=7 arm_optionally_use_neon=true arm_fpu="neon-vfpv4" is_clang=false is_debug=false is_nacl_glibc=true libyuv_use_neon=true rtc_build_with_neon=true rtc_include_internal_audio_device=false rtc_include_pulse_audio=false rtc_libvpx_build_vp9=false rtc_use_gtk=false strip_debug_info=true treat_warnings_as_errors=false use_aura=false use_dbus=false use_gold=true use_goma=false use_lld=false use_ozone=false use_udev=false rtc_build_examples=false rtc_build_tools=false rtc_include_tests=false use_glib=false rtc_use_x11 = false arm_float_abi="softfp" rtc_use_pipewire=false use_custom_libcxx=false rtc_use_h264=true proprietary_codecs=true rtc_enable_protobuf=false use_rtti=true rtc_build_json=true ffmpeg_branding="Chrome" use_openh264=true use_custom_libcxx_for_host=false'
或者
gn gen out/linux_Hi3516Arm --args='target_os="linux" target_cpu="arm" arm_arch="armv7-a" arm_tune="cortex-a7" arm_version=7 arm_optionally_use_neon=true arm_fpu="neon-vfpv4" is_clang=false is_debug=false is_nacl_glibc=false arm_float_abi="softfp" libyuv_use_neon=true rtc_build_with_neon=true rtc_include_internal_audio_device=false rtc_include_pulse_audio=false rtc_libvpx_build_vp9=false rtc_use_gtk=false strip_debug_info=true treat_warnings_as_errors=false use_aura=false use_dbus=false use_gold=true use_goma=false use_lld=false use_ozone=true use_udev=false rtc_build_examples=false rtc_build_tools=false rtc_include_tests=false rtc_use_x11 = false use_custom_libcxx=false rtc_use_h264=true proprietary_codecs=true rtc_use_pipewire=false rtc_enable_protobuf=false use_rtti=true rtc_build_json=true ffmpeg_branding="Chrome" use_openh264=true use_custom_libcxx_for_host=false'
若不加use_rtti=true,会在编译自己程序连接静态库时报下面这个错: 解决来源
undefined reference to `typeinfo for rtc::MessageHandler'
然后将toolchain.ninja文件中的 arm-linux-gnueabihf 替换为 arm-hisiv400-linux
使用命令查看配置的参数及参数的含义
gn args --list out/linux_Hi3516Arm
然后运行
ninja -C out/linux_Hi3516Arm
期间出现了错误:
A、
error: 'isfinite' was not declared in this scope
解决: 将对应文件的isfinite改为std::isfinite
B、pfft报错
解决: 关闭pfft的多核否则报错,参考 来源
4、头文件提取(粗糙的提取)
#!/bin/bash
#src_path=`find src/ -name "*.h*" | grep -E "src/base|src/third_party|src/media|src/api|src/common_audio|src/modules|src/pc|src/rtc_base|src/system_wrappers" | grep -v ".html" | grep -v "android_ndk"`
src_path=`find src/ -name "*.h*" | grep -v "html*" | grep -v "src/build/*" | grep -v "android_ndk*" | grep -v "blink*" | grep -v "txt*"`
#echo $src_path
for obj in $src_path
do
echo "cp header file $obj"
cp --parents $obj inc/ -f
done
5、使用静态库编译选项
-DWEBRTC_LINUX=1 -DWEBRTC_POSIX=1