WebRTC iOS Native SDK 接入

借助于 OpenRTCClient 项目,我们可以非常方便地编译出 WebRTC iOS native SDK,通过 OpenRTCClient 项目提供的 webrtc_pack 工具,我们可以很方便地创建包含了 arm64、和 x64 两种还在广泛使用的 CPU 架构二进制代码的 webrtc 静态库文件。这里说明为 iOS 应用接入 webrtc 静态库文件的过程。(WebRTC 构建系统默认也提供了构建 Framework 的 target,具体的构建 target 为 framework_objc。)

在 iOS 应用程序中使用 WebRTC iOS native API 的一种比较简单的接入方式是,在 WebRTC 的构建系统中为 iOS 应用程序创建一个 GN/ninja 的构建 target,统一用 WebRTC 的构建系统来编译 WebRTC SDK 和 iOS 应用程序。但这种 WebRTC native SDK 的接入方式,对于我们一般的 iOS 应用开发来说,不是很友好。一般来说,我们更希望可以拿到一个 SDK 包,里面包含必须的二进制库文件和头文件,然后修改 iOS 应用的 Xcode 工程配置来引入库,如向头文件搜索路径中添加库的头文件路径等。

要为 WebRTC native SDK 创建一个开发包的话,获得编译生成的二进制库文件比较容易,但获得完整的 API 头文件比较麻烦。

1、WebRTC iOS native SDK API 说明

WebRTC C++ 核心库提供的 API 可以认为由三个部分组成:

  1. 以 PeerConnectionInterface 为中心的核心框架 API。WebRTC 中 PeerConnection 定义 RTC 的 pipeline,它把各模块组件有机地连接起来,构造完整的 RTC 场景。核心框架 API 既包括 PeerConnection 的 API,也包括 PeerConnection 的 pipeline 中各个模块组件的部分接口。相关头文件位于 webrtc/api 目录下。

  2. 模块组件 API。PeerConnection 的 pipeline 中各个模块组件提供的 API,如 audio processing 提供的 AudioProcessing 和 AudioProcessingBuilder,位于 webrtc/modules/audio_processing/include,用于桌面共享的 API 位于 webrtc/modules/desktop_capture。

  3. 基础的实用程序 API。如在 webrtc/rtc_base 目录下包含了大量的辅助工具 API,包括日志,线程,任务队列,同步原语等等等。

WebRTC 的开发者一定是非常不希望其它开发者直接使用 WebRTC 的 C++ API 的,否则 WebRTC 的 C++ API 也不至于设计的如此混乱:

  1. 核心框架 API 的大量头文件包含了各个模块组件的头文件以及基础的实用程序头文件。

  2. 核心框架 API 的大量组件依赖于其它部分的接口。

  3. 其他开发者几乎无法捋出来 WebRTC SDK 的 C++ API 头文件,因为他们广泛分布于整个代码库的各个位置。

WebRTC C++ API 的混乱设计导致它们完全无法脱离 WebRTC 的源码库来使用。

WebRTC 项目倒是很友好地为 Android 和 iOS 开发者提供了非常干净的 Java 和 Objective-C API,这些 API 分别位于 webrtc/sdk/android 和 webrtc/sdk/objc。WebRTC 的 Objective-C API 主要是对底层 C++ API 的封装,但也通过定义 RTCVideoEncoderFactory 和 RTCVideoDecoderFactory 将系统提供的视频硬编硬解的能力接入 PeerConnection 定义 RTC 的 pipeline。WebRTC 的 Objective-C API 完整头文件可以通过 webrtc/sdk/BUILD.gn 中定义的构建 target “framework_objc” 来了解。

这里我们使用一些 WebRTC 的 C++ API,使用一些 WebRTC 的 Objective-C API。后面我们还会看到 WebRTC 的 C++ API 其它一些十分坑爹的地方。

2、通过 Xcode 创建一个工程

1.打开 Xcode。 Xcode

2.选择 “Create a new Xcode project”。

Xcode 001

3.选择 “iOS” 标签下的 “App”。

Xcode 002

4.输入产品名称 "Product Name: ",选择 "Team: ",输入组织标识符 “Organization Identifier:”,"Interface: " 选择 “Storyboard”,语言 "Language: " 选择 “Objective-C”,然后点击 “Next”。为 iOS 工程选择一个目录来创建工程目录,结束 Xcode 工程创建过程。

Xcode 003

3、为 iOS 应用工程引入 WebRTC 静态库

  1. WebRTC native SDK 提供的是 C++ 的 API,为了在 iOS 应用工程中使用 WebRTC 的 native API,需要将引用 WebRTC native API 的源文件后缀名由 .m 修改为 .mm,这里修改 ViewController.m 和 main.m 这两个源文件的后缀名为 .mm。

  2. 引入 WebRTC 静态库

在这一步中,我们在 main.mm 中包含一些 WebRTC 的头文件,调用一些基本的 API,并使应用程序编译链接成功,并能在 iPhone 模拟器中运行起来。

我门在 main.mm 中调用创建 webrtc::PeerConnectionFactoryInterface 的 webrtc::CreatePeerConnectionFactory() 接口,并包含相关的头文件,这样 main.mm 的完整代码如下:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
​
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
#include "api/create_peerconnection_factory.h"
#include "api/peer_connection_interface.h"
#include "api/video_codecs/builtin_video_decoder_factory.h"
#include "api/video_codecs/builtin_video_encoder_factory.h"
#include "rtc_base/thread.h"
​
int main(int argc, char * argv[]) {
    std::unique_ptr<rtc::Thread> network_thread_ = rtc::Thread::CreateWithSocketServer();
    network_thread_->SetName("network_thread", nullptr);
    if (!network_thread_->Start()) {
      fprintf(stderr, "Failed to start network thread\n");
    }
​
    std::unique_ptr<rtc::Thread> worker_thread_ = rtc::Thread::Create();
    worker_thread_->SetName("worker_thread", nullptr);
    if (!worker_thread_->Start()) {
      fprintf(stderr, "Failed to start worker thread\n");
    }
​
    std::unique_ptr<rtc::Thread> signaling_thread_ = rtc::Thread::Create();
    signaling_thread_->SetName("signaling_thread", nullptr);
    if (!signaling_thread_->Start()) {
      fprintf(stderr, "Failed to start worker signaling thread\n");
    }
​
    rtc::scoped_refptr<webrtc::PeerCo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值