# 第 12 部分导论 · 一套核心，服务所有平台

> 前十一部分讲的 C++ 引擎，怎么落到浏览器、Android、iOS、桌面？这一章讲清 WebRTC 的跨平台策略：api/ 目录是所有平台共享的原生基座，各平台在其上加一层语言绑定和平台相关的采集/渲染，核心引擎一份代码到处复用。

- 作者：David（道雾轩）
- 专栏：音视频与 WebRTC 详解（https://daiw.org/manual/webrtc.md）
- 最后更新：2026-07-15
- 原文：https://daiw.org/manual/webrtc/platform-overview
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

# 第 12 部分导论 · 一套核心，服务所有平台

前十一部分讲的是一套 **C++ 引擎**。但用户用的是 Chrome、是 Android App、是 iPhone、是桌面程序。这套 C++ 核心**怎么落到这些千差万别的平台**？这是最后一部分的主题——也是把 WebRTC 从“一个库”变成“[无处不在的能力](https://daiw.org/manual/webrtc/what-is-webrtc)”的关键一步。

## api/ 是所有平台的共同基座

WebRTC 官方文档（[g3doc/index.md](https://daiw.org/manual/webrtc/reading-the-source)）开宗明义：

> WebRTC 库的公共 API 就是 `api/` 目录及其子目录，用户不应依赖其他文件。

<Callout type="info">
  **WebRTC 的跨平台策略是“**一个原生 C++ 核心 + 每平台一层薄绑定**”：`api/` 目录（[`PeerConnectionFactoryInterface`、`PeerConnectionInterface` 等](https://daiw.org/manual/webrtc/factory-and-context)）是所有平台共享的**原生基座**，[前十一部分讲的引擎](https://daiw.org/manual/webrtc/call-recap)全在它之下；各平台只需在其上加一层**语言绑定**（把 C++ 接口翻译成 Java / Objective-C / JS）和**平台相关的采集 / 渲染**。** 于是绝大部分代码（[协商、ICE、加密、RTP、拥塞控制、音视频、数据通道、地基](https://daiw.org/manual/webrtc/call-recap)）**一份、跨平台复用**，平台差异被压缩到很薄的两层：

  - **语言绑定层** —— [Android 的 JNI](https://daiw.org/manual/webrtc/android-sdk)（Java ↔ C++）、[iOS/macOS 的 Objective-C 封装](https://daiw.org/manual/webrtc/ios-sdk)、浏览器里 Chromium 的 [Blink 绑定](https://daiw.org/manual/webrtc/what-is-webrtc)（JS ↔ C++）。它们都对着[同一个 `api/`](https://daiw.org/manual/webrtc/factory-and-context)。
  - **平台采集 / 渲染层** —— [摄像头采集](https://daiw.org/manual/webrtc/video-capture)、[屏幕采集](https://daiw.org/manual/webrtc/desktop-capture)、音频设备、视频渲染——这些必然依赖具体 OS，是平台相关的“输入输出端”。

  **核心引擎不关心自己跑在哪**，它只处理“[进来的媒体帧](https://daiw.org/manual/webrtc/video-frame)”和“[出去的网络包](https://daiw.org/manual/webrtc/rtp-sender)”；采集从哪来、画面渲染到哪去、API 被什么语言调用，交给平台层。这个“[窄腰](https://daiw.org/manual/webrtc/factory-and-context)”设计（一个核心、多个绑定）是 WebRTC 能同时占领[浏览器和移动端](https://daiw.org/manual/webrtc/what-is-webrtc)的根本原因。
</Callout>

## 分层图景

把[整个 WebRTC](https://daiw.org/manual/webrtc/call-recap) 按“平台无关 / 平台相关”分层，是这样：

```mermaid
flowchart TD
    subgraph 平台相关["平台相关(薄)"]
        BIND["语言绑定<br/>JNI / ObjC / Blink"]
        CAP["采集 / 渲染<br/>摄像头 / 屏幕 / 音频设备"]
    end
    subgraph 平台无关["平台无关的 C++ 核心(厚,第 0-11 部分)"]
        API["api/ 公共接口<br/>PeerConnectionFactory/Interface"]
        ENGINE["引擎:协商/ICE/加密/RTP/拥塞控制/音视频/数据通道"]
        BASE["地基 rtc_base"]
    end
    BIND --> API
    CAP --> ENGINE
    API --> ENGINE
    ENGINE --> BASE
```

上面薄薄两层随平台变，下面厚厚的核心[一份代码](https://daiw.org/manual/webrtc/call-recap)。**你读懂了核心，就读懂了 WebRTC 的 95%**；平台层只是“把核心接到具体 OS 上”的适配。

## 这一部分怎么安排

- [Android 的 JNI 桥](https://daiw.org/manual/webrtc/android-sdk) —— Java 怎么调到 C++ 核心。
- [iOS/macOS 的 Objective-C 封装](https://daiw.org/manual/webrtc/ios-sdk) —— Apple 平台的绑定。
- [桌面采集](https://daiw.org/manual/webrtc/desktop-capture) —— 屏幕 / 窗口捕获（`DesktopCapturer`）。
- [摄像头采集](https://daiw.org/manual/webrtc/video-capture) —— 视频输入端（`VideoCaptureModule`）。
- [构建 libwebrtc](https://daiw.org/manual/webrtc/building-webrtc) —— 怎么真正把这套庞然大物编译出来（depot_tools/GN/Ninja）。
- [全专栏收尾](https://daiw.org/manual/webrtc/webrtc-recap) —— 回顾 12 部分、WebRTC 全景、继续之路。

## 小结与下一章

WebRTC 的跨平台策略是“**一个原生 C++ 核心 + 每平台一层薄绑定**”：[`api/` 目录](https://daiw.org/manual/webrtc/factory-and-context)是所有平台共享的**原生基座**（[前十一部分的引擎](https://daiw.org/manual/webrtc/call-recap)全在其下），各平台只加**语言绑定**（[JNI](https://daiw.org/manual/webrtc/android-sdk)/[ObjC](https://daiw.org/manual/webrtc/ios-sdk)/Blink）和**平台采集 / 渲染**（[摄像头](https://daiw.org/manual/webrtc/video-capture)/[屏幕](https://daiw.org/manual/webrtc/desktop-capture)/音频设备）两薄层。核心引擎[不关心跑在哪](https://daiw.org/manual/webrtc/factory-and-context)，只处理进来的[帧](https://daiw.org/manual/webrtc/video-frame)和出去的[包](https://daiw.org/manual/webrtc/rtp-sender)——这个“窄腰”设计让一份核心服务[所有平台](https://daiw.org/manual/webrtc/what-is-webrtc)。

先看最典型的一层绑定——**Android 的 JNI 桥**。👉 [Android SDK 与 JNI](https://daiw.org/manual/webrtc/android-sdk)。

## 参考资料

- [1] WebRTC 官方 `g3doc/index.md`（公共 API = `api/`）。
- [2] libwebrtc 源码.`api/`（公共接口）、`android/`、`objc/`（平台绑定）。
- [3] 关联[第 1 部分工厂](https://daiw.org/manual/webrtc/factory-and-context)、[全景回顾](https://daiw.org/manual/webrtc/call-recap)。
