Mac下编译WebRTC(Mac和iOS版本)

2023-11-18

前言

随着新冠疫情的影响,这两年音视频的需求呈爆发式增长。在音视频领域中,WebRTC可以说是一个绕不开宝库,包括了音视频采集、编解码、传输、渲染的全过程。本文主要记录下在Mac平台上编译WebRTC Mac和iOS版本的全过程。

设置代理

因为众所周知的原因,要下载WebRTC的源码是需要代理工具的。

export http_proxy="http://127.0.0.1:21087"
export https_proxy="http://127.0.0.1:21087"

安装工具depot_tools

git clone获取depot_tools

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

将depot_tools的路径配置到环境变量中

export PATH=$PWD/depot_tools:$PATH

下载webrtc源码

mkdir webrtc
cd webrtc
fetch --nohooks webrtc_ios
gclient sync

默认下载的是最新的源码,如果想要切换到指定分支,可以使用以下命令:

# 查看可用版本分支
git branch -r
# 切换到m79分支
git checkout branch-heads/m79
gclient sync
# 或者强制切换到指定commit(b484ec0082948ae086c2ba4142b4d2bf8bc4dd4b是m79最后一次提交的commit id)
gclient sync -r b484ec0082948ae086c2ba4142b4d2bf8bc4dd4b --force

可以在从这里获取webrtc所有release版本的信息

编译

Mac版本:

gn gen out/mac-release --args='target_os="mac" target_cpu="x64" is_debug=false use_rtti=true is_component_build=false rtc_use_h264=false rtc_include_tests=false' --ide=xcode
ninja -C out/mac-release

编译成功后会在src\out\xxxx\下生成all.xcworkspace文件。打开就可以构建、调试webrtc的项目。其中APPRTCMobile是谷歌提供的示例demo,可以在Mac下直接编译运行。

iOS版本:

# 编译不带证书版本
gn gen out/ios-release --args='target_os="ios" target_cpu="arm64" is_debug=false use_rtti=true is_component_build=false ios_enable_code_signing=false proprietary_codecs=false rtc_use_h264=false rtc_include_tests=false' --ide=xcode
ninja -C out/ios-release

# 获取证书名
security find-identity -v -p codesigning

# 编译带证书版本
gn gen out/ios-release-sign --args='target_os="ios" target_cpu="arm64" is_debug=false use_rtti=true is_component_build=false ios_code_signing_identity="上面命令获取到的那串数字" proprietary_codecs=false rtc_use_h264=false rtc_include_tests=false' --ide=xcode
ninja -C out/ios-release-sign

编译成功后,会在src\out\xxxx\下生成all.xcworkspace文件。打开就可以构建、调试webrtc的项目。其中APPRTCMobile是谷歌提供的示例demo,可打包在真机上运行。在src\out\xxxx\也生成了WebRTC.framework库文件,在外部项目中引用该库文件就可以使用其音视频能力了。

WebRTC.framework库文件也可以通过ninja命令或者python脚本单独生成。

# 通过ninja命令单独生成WebRTC.framework库文件
ninja -C out/ios-release-sign framework_objc

# 通过build_ios_libs.py脚本生成WebRTC.framework库文件
python tools_webrtc/ios/build_ios_libs.py --bitcode

通过python脚本(较早版本的webrtc,最新版本的生成xcframework)生成的库文件在 src/out_ios_lib目录下。该目录下会有5个文件夹,其中WebRTC.framework是支持arm、arm64、x64、x86这四种架构的动态库。另外,arm_libs、arm64_libs、x64_libs、x86_libs文件夹里分别是单独支持这四种架构的动态库。可以通过lipo -info或者file命令来查看其支持的架构。

苹果后来新出的xcframework的库类型,为支持其大一统的多平台多架构。webrtc较早版本的build_ios_libs.py是不支持生成xcframework,为此可以通过以下脚本将framework转换为为xcframework。

#!/bin/bash

mkdir iphoneos iphonesimulator

cp -R WebRTC.framework  iphoneos
cp -R WebRTC.framework  iphonesimulator

lipo -remove i386 -remove x86_64 iphoneos/WebRTC.framework/WebRTC -o iphoneos/WebRTC.framework/WebRTC
lipo -remove armv7 -remove arm64 iphonesimulator/WebRTC.framework/WebRTC -o iphonesimulator/WebRTC.framework/WebRTC

xcodebuild -create-xcframework \
-framework iphoneos/WebRTC.framework \
-framework iphonesimulator/WebRTC.framework \
-output "WebRTC.xcframework"

其他

  • 可能碰到编译错误——fatal error: ‘libavutil/avconfig.h’ file not found。解决方案:在src/third_party/ffmpeg/libavutil/创建avconfig.h文件,内容如下:
/* Generated by ffconf */
\#ifndef AVUTIL_AVCONFIG_H
\#define AVUTIL_AVCONFIG_H
\#define AV_HAVE_BIGENDIAN 0
\#define AV_HAVE_FAST_UNALIGNED 0
\#endif /* AVUTIL_AVCONFIG_H */
  • 编译带证书版本中碰到错误——Error: no mobile provisioning profile found for “com.google.AppRTCMobile”。解决方案:打开all.xcworkspace工程,修改工程中的Signing为你自己的,重新编译工程即可。

  • 我编译的版本存在一个未解决问题——
    fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: file list file: obj/third_party/ffmpeg/libffmpeg_internal.a.rsp is empty。只能先设置rtc_use_h264=false,不使用h264。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mac下编译WebRTC(Mac和iOS版本) 的相关文章

随机推荐

  • Nand Flash基础知识

    1 Nand Flash组织架构 Device Package 就是封装好的nand flash单元 包含了一个或者多个target 一个target包含了一个或者多个LUN 一个target的一个或者多个LUN共享一组数据信号 每个tar
  • 一个迷惑性很高的生产故障-Elasticsearch日志rotate导致节点CPU激增

    背景 Elasticsearch CPU很高的场景很常见 优化读写以及扩容即可解决问题 如果只有一个节点CPU高 那可能的情况就比较多了 节点机器异常 读写不均匀 GC过高 forcemerge 这里描述一个极具迷惑性的case 问题 收到
  • 电机专题2:直流有刷电机工作原理

    直流有刷电机的工作原理 直流有刷电机 其实就是直接最简单的方式利用安培力 给导线通电 然后在磁场中运动 在上面的电流电机物理模型中 电刷和主磁铁是固定不动的 是电机的定子 绕组线圈和换向片连接到一起 为转子 电机的工作过程 这种是直流有刷电
  • diskmark使用教程

    raid盘测速 首先说明一下软件各个参数的意义 1 9 测试次数 50MB 4000MB 测试规模 C D E F选择测试对象 ALL 测试以下所有 第一行代表你硬盘的读写速度 第二行代表你硬盘4K文件多线程读写速度 第三行代表你硬盘的连续
  • 计算机概论易错题总结:概念类

    为期末考试 冲鸭 文字类 1 在计算机运行时 把程序和数据一样存放在内存中 这是1946年由 领导的研究小组 正式提出并论证的 冯 诺依曼 2 被誉为第一位程序员的是 Augusta 3 我国自行设计研制的天河2号计算机是 巨型机 记法 天
  • JSP动态网页设计——tomcat配置、第一个动态工程

    默认设置 已完成eclipse安装 JDK安装 环境配置 下载tomcat压缩包 已上传至资源 并解压好 启动tomcat 在此文件夹下找到bin文件 在bin目录下点击startup bat 启动标志 双击弹出黑框 若出现以下图片 则已启
  • STL之Set基本用法

    单独说一下Set是因为这个工具以前很少用 因为接触不多 后来发现功能太强大了 本来很多题目用Set可以快速通过 但无奈之前都没有使用set的习惯 导致吃了不少亏 set功能非常强大 原因在于Set就是一棵二叉搜索树 我们在很多题目中经常遇到
  • 在Android下初始化Native OpenGL ES

    在上一篇文章中 介绍了在Android Native层初始化EGL及OpenGL ES的方法 其中 大量代码花费在EGL的初始化上面 非常的麻烦 在本文中 将展示利用GLSurfaceView来代替我们手动初始化EGL的过程 用GLSurf
  • 数据分析 告诉你《飞驰人生》为什么这么燃?

    数据分析 飞驰人生 为什么这么燃 2019年贺岁电影 飞驰人生 在豆瓣排名和猫眼排名中都排名第二的位置 我们这里爬取了豆瓣500条的评论数据来 分析一下 飞驰人生 为何这么燃 这里说明一下 之所以获取这么点数据 是豆瓣的 的反爬限制 非登录
  • Vue 0基础学习路线(24)—— 图解深度详述vue的路由动画效果的使用及详细案例(附详细案例代码解析过程及版本迭代过程)

    文章目录 1 路由动画效果 2 实例 2 1 example01 1 路由动画效果 路由动画 gt 利用 transition 组件 我们还可以给路由导航加上动效 App vue
  • TCP/IP协议:传输层之UDP

    一 UDP用户数据报协议 它是一个无连接的 面向数据报的协议 它不提供可靠性但传输速度比TCP要快 UDP数据报中的 UDP长度 为两个字节 所以我们要发送的UDP数据最多支持65507大约68K的数据 超过该大小的话需要自己来分割发送 使
  • JAVA如何连接redis以及Springboot整合redis详解

    1 java连接redis 1 1 java连接单机redis 首先创建一个普通的maven工程 1 引入依赖
  • 我发现了一个很好看的字体,霞鹜文楷!如何换windows和typora字体?

    1 字体 官方地址如下 下载也很简单 https github com lxgw LxgwWenKai 有1W多的stars 方式 直接打包下载 下载不来 可以联系在下面留言 然后ttf的文件 全部安装就行了 2 更换系统字体 然后换win
  • Codeforces Round 871 (Div. 4)G. Hits Different

    G Hits Different 题意 给一个如图所示的三角形 输入n 击倒方块n 获得分数n n 同时方块n上面的两个方块也会落下 同时获得这两个方块的分数 一直向上走 知道方块1 如图所示为n 9的时候掉落的方块 求获得的分数 思路 先
  • python对csv文件取特定列生成新csv文件

    import csv import os def file name in file out file reader csv reader in file header next reader data header format head
  • 用C语言写一个类似天天酷跑游戏(图形库用easyx)

    1 头文件 全局变量和结构体 a 玩家结构体 b 枚举玩家三种状态 奔跑 跳跃 滑行 c 障碍物结构体 d 障碍物结点 e 枚举出障碍物类型 include
  • Java做运维之配置多服务器间SSH免密登录

    Java做运维之配置多服务器间SSH免密登录 说明 第一步 引入依赖 第二步 编写核心操作类 1 RmtShellExecutor 2 CommonStringUtil 3 IoUtil 4 SshAccount 5 SshNoPwdUti
  • HTML、CSS及JS之间的区别浅谈

    HTML CSS 和 JS 是构建网页的三种核心技术 HTML Hypertext Markup Language 是一种标记语言 用于描述网页的结构和内容 通过 HTML 开发人员可以创建网页元素 例如标题 段落 列表 链接和图像等 CS
  • 嵌入式开发之移植MQTT到RK3568

    目录 前言 一 下载qmqtt源码 二 编译库文件 三 移植到RK3568 3 1 移植动态库libQt5Qmqtt 四 联机测试 4 1 制作demo 4 1 1 创建demo新项目 4 1 2 添加network模块支持 4 1 3 添
  • Mac下编译WebRTC(Mac和iOS版本)

    前言 随着新冠疫情的影响 这两年音视频的需求呈爆发式增长 在音视频领域中 WebRTC可以说是一个绕不开宝库 包括了音视频采集 编解码 传输 渲染的全过程 本文主要记录下在Mac平台上编译WebRTC Mac和iOS版本的全过程 设置代理