MacOS下C++使用WebRTC注意事项及问题解决

目录
  • 背景
  • 碰到的问题与解决
  • 总结macos嵌入webrtc流程

背景

近一段时间在开发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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2022-09-20

5分钟搭建一个WebRTC视频聊天

在上篇文章给大家介绍了在Ubuntu上搭建一个基于webrtc的多人视频聊天服务实例代码详解,感兴趣的朋友可以参考下.今天给大家分享一篇关于5分钟搭建一个WebRTC视频聊天. 百度一下WebRTC,我想也是一堆.本以为用这位朋友( 搭建WebRtc环境 )的SkyRTC-demo 就可以一马平川的实现聊天,结果折腾了半天,文本信息都发不出去,更别说视频了.于是自己动手. 想在公网上实现视频通信,需要下面3个核心元素: 一个是NAT穿透服务器(ICE Server),实现内网穿透,具体的作用可以

在Ubuntu上搭建一个基于webrtc的多人视频聊天服务实例代码详解

WebRTC,即Web Real-Time Communication,web实时通信技术.简单地说就是在web浏览器里面引入实时通信,包括音视频通话等. 在疫情期间哪里也去不了,在家没事就研究webrtc视频直播技术,网上找了些教程最终都不太能顺利跑起来的,可能是文章写的比较老,使用的一些开源组件已经更新了,有些配置已经不太一样了,所以按照以前的步骤会有问题.折腾了一阵终于跑起来了,记录一下. 一个简单的聊天室html页面 这个页面使用simple-webrtc来实现webrtc的通讯,sim

Python3从零开始搭建一个语音对话机器人的实现

01-初心缘由 最近在研究语音识别方向,看了很多的语音识别的资料和文章,了解了一下语音识别的前世今生,其中包含了很多算法的演变,目前来说最流行的语音识别算法主要是依赖于深度学习的神经网络算法,其中RNN扮演了非常重要的作用,深度学习的应用真正让语音识别达到了商用级别.然后我想动手自己做一个语音识别系统,从GitHub上下载了两个流行的开源项目MASR和ASRT来进行复现,发现语音识别的效果没有写的那么好,其中如果要从零来训练自己的语言模型势必会非常耗时. 因此,就有了一个新的想法,借助一些开源的

Flask入门教程实例:搭建一个静态博客

现在流行的静态博客/网站生成工具有很多,比如 Jekyll, Pelican, Middleman, Hyde 等等,StaticGen 列出了目前最流行的一些静态网站生成工具. 我们的内部工具由 Python/Flask/MongoDB 搭建,现在需要加上文档功能,写作格式是 Markdown,不想把文档放到数据库里,也不想再弄一套静态博客工具来管理文档,于是找到了 Flask-FlatPages 这个好用的 Flask 模块.熟悉 Flask 的同学花几分钟的时间就可以用搭建一个简单博客,加

Docker 1分钟搭建DNS服务器的方法

这里我们使用dnsmasq对应的docker版本docker-dnsmasq. 使用指南 下载镜像 docker pull docker-dnsmasq 创建最简单的配置/opt/dnsmasq.conf #dnsmasq config, for a complete example, see: # http://oss.segetech.com/intra/srv/dnsmasq.conf #dns解析日志 log-queries #定义主机与IP映射 address=/h0/172.17.2

详解使用React全家桶搭建一个后台管理系统

引子 学生时代为了掌握某个知识点会不断地做习题,做总结,步入岗位之后何尝不是一样呢?做业务就如同做习题,如果'课后'适当地进行总结,必然更快地提升自己的水平. 由于公司采用的react+node的技术栈,于是就完成了一个reactSPA小项目,计划日后把平时工作中遇到的业务以及学习中遇到有趣的东西给抽象成demo展示出来.目前该项目只是把雏形搭好,效果如下.在此文的基础上,写了篇新文章使用React全家桶搭建一个后台管理系统,欢迎围观.(附注:因为项目不时更新,文章不一定会即时更新,所以以实际的

IDEA上面搭建一个SpringBoot的web-mvc项目遇到的问题

这几天一直在研究IDEA上面怎么搭建一个web-mvc的SpringBoot项目,看网上的教程一步步的搭建,可是还是出现一堆的问题. 为了让大家以后少走一些弯路,我在这里分享一下我这几天研究的成果,也希望对大家能有所帮助. 这里先介绍一下各种环境的配置信息:idea2016.2.1  jdk1.8.0_31 因为SpringBoot中是内置tomcat的,所以也就不需要额外的tomcat配置了,现在开始讲如何在idea上面搭建SpringBoot web-mvc项目了 步骤一:在IDEA中新建一

java搭建一个Socket服务器响应多用户访问

当我们搭建了一个Socket服务端,是需要去响应多用户的访问的.此时,我们就要使用多线程,为每个访问的用户建立一个线程来响应该用户的访问. 具体实现,看如下代码: package com.sun.socket; import Java.io.IOException; import java.NET.*; import java.io.*; import java.util.*; /** * Description: * 搭建一个Socket服务器响应多用户访问 * @author Lee * *

利用laravel搭建一个迷你博客实战教程

本文主要给大家介绍的是关于利用laravel搭建一个迷你博客的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 一.设计与思路 在开始写第一行代码之前,一定要尽量从头到尾将我们要做的产品设计好,避免写完又改,多写不必要的代码. 需求分析:我们的迷你博客应该至少包含:新增/编辑/查看/删除文章,以及文章列表展示功能. 数据库分析:基于这个功能,我们只需要一张 Articles 数据表来存放文章即可. 页面结构分析:应该使用模板继承建立一张基础模板包含:头部/文章列表/底部信

ASP建立一个简单的聊天室

经过一个阶段的asp学习,下面我们结合所学过的内容建立一个最简单的聊天室,虽然很简单,但是大家可以通过它来掌握一个聊天室建立的基本过程,并且可以不断的完善其功能. 下面介绍其主要步骤: 1,添加Global.asa文件里面的代码.这部分代码主要处理Application_onStart事件,在此事件中,定义了一个有15个元素的数据,并把它赋给了一个Application对象的属性.Global.asa文件的内容如下. <SCRIPT LANGUAGE="VBScript" RUN