海思webrtc交叉编译

一、准备

1、在ubuntu14.04 64bit

  因为arm-hisiv400-linux是32位的,故需要在该系统安装兼容32位程序运行的库,参考博客
海思webrtc交叉编译_第1张图片

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 \&p){ return p->audio_source == audio_source; });|" modules/audio_mixer/audio_mixer_impl.cc

3、海思3516A编译

修改src/BUILD.gn文件,在里面添加红框部分,我使用编译自己程序时如果不加这个会在链接时报"未定义的webrtc::CreatePeerConnectionFactory "海思webrtc交叉编译_第2张图片

#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'

海思webrtc交叉编译_第3张图片

  然后将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的多核否则报错,参考 来源
海思webrtc交叉编译_第4张图片

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 

三、参考

《1》、海思dv300cv500交叉编译webrtc
《2》、WebRTC 编译支持arm架构

你可能感兴趣的:(流媒体)