MacOS下C++使用WebRTC注意事项及问题解决
作者:粘锅咸鱼
这篇文章主要介绍了MacOS下C++使用WebRTC注意事项,对于iOS/macOS平台,开启openh264,去除test,使用一些命令可以轻松解决,下面小编给大家带来了问题及解决方法,需要的朋友可以参考下
背景
近一段时间在开发MacOS下视频相关app,之前一直通过WebRTC.framework的形式引用webrtc的objc接口, 由于新的特性不仅需要oc接口,还需要使用WebRTC C++接口,因此需改成通过静态库链接webrtc.
碰到的问题与解决
对于iOS/macOS平台,开启openh264,去除test,使用如下命令
gn gen out/mac --args="proprietary_codecs=true use_openh264=true ffmpeg_branding=\"Chrome\" rtc_include_tests=false"ninja -C out/mac
可以生成WebRTC.framework以及对应的C++静态库libwebrtc.a. 但是当我尝试直接链接出来的libwebrtc.a时,编译器报出下面两类链接问题
1, typeid符号找不到
2,所有objective-c符号
对于第一个问题加上
use_rtti=true
开启RTTI后可以解决,对于第二个问题,经过查看编译产物发现,在out/mac/obj/sdk下有若干.a库
libbase_native_additions_objc.a libbase_objc.a libcallback_logger_objc.a libdefault_codec_factory_objc.a libfile_logger_objc.a libhelpers_objc.a libmediaconstraints_objc.a libmediasource_objc.a libmetal_objc.a libnative_api.a libnative_video.a libpeerconnectionfactory_base_objc.a libui_objc.a libvideo_objc.a libvideo_toolbox_cc.a libvideocapture_objc.a libvideocodec_objc.a libvideoframebuffer_objc.a libvideorendereradapter_objc.a libvideosource_objc.a libvideotoolbox_objc.a libvp8.a libvp9.a libvpx_codec_constants.a libwrapped_native_codec_objc.a
猜测objective-c的符号应该是没有被编译进入libwebrc.a,而是在out/mac/obj/sdk这些库中。将全部这些库增加到链接目录,又发现有重复符号。去除libbase_objc.a和libhelper_objc.a后解决。
解决这些问题后,可以编译链接成功。但是运行的时候会崩溃。查看调用堆栈,崩溃代码在std::string内部。怀疑是标准库冲突引起的,查阅相关资料发现webrtc默认使用自带的libc++库,由于xcode默认也用libc++,因此接口是兼容的,但是内部实现可能不同,导致运行崩溃。加上
use_custom_libcxx=false
这个编译选项后,成功运行。
总结macos嵌入webrtc流程
1,编译
gn gen out/mac --args="use_rtti=true use_custom_libcxx=false proprietary_codecs=true use_openh264=true ffmpeg_branding=\"Chrome\" rtc_include_tests=false" ninja -C out/mac
2, 导出头文件
3,引用
libwebrtc.a libbase_native_additions_objc.a libcallback_logger_objc.a libdefault_codec_factory_objc.a libfile_logger_objc.a libmediaconstraints_objc.a libmediasource_objc.a libmetal_objc.a libnative_api.a libnative_video.a libpeerconnectionfactory_base_objc.a libui_objc.a libvideo_objc.a libvideo_toolbox_cc.a libvideocapture_objc.a libvideocodec_objc.a libvideoframebuffer_objc.a libvideorendereradapter_objc.a libvideosource_objc.a libvideotoolbox_objc.a libvp8.a libvp9.a libvpx_codec_constants.a libwrapped_native_codec_objc.a
到此这篇关于MacOS下C++使用WebRTC注意事项的文章就介绍到这了,更多相关C++使用WebRTC内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!