从 GIPS 到 WebRTC
GIPS(Global IP Sound)成立于 1999 年,专注 VoIP 与语音信号处理,凭借弱网下低延迟、高音质的表现被 WebEx、Skype 采用。2010 年谷歌收购并开源其核心代码,拉开了实时音视频行业的序幕。
RTC 更聚焦“实时性”,可在极短时间内传输音频、视频和数据,实现自然流畅的实时交流与互动
实时音视频,即 RTC,是一种实时通信技术,它允许计算机、网络设备或移动设备之间进行音频、视频或数据交换。RTC 的核心是交流,强调对语义信息进行高质量、高效率的传递。借助 RTC,用户可以进行音视频通话、互动直播等,实现线上实时交流。
相比泛指的通信,RTC 更加聚焦实时性:通常要求端到端延时控制在数百毫秒以内,从而让远隔千里的用户也能像面对面一样自然交流。

保证用户高登录成功率,不受连接设备、网络情况、地域环境等因素限制,随时随地接入网络、触达业务。
保证音视频数据传输低延时、低卡顿,通过网络实时动态路由规划,以最优边缘节点接入,降低端到端延时。
除基础音视频外,图像、声音、音效等多种交互方式反馈的实时性,需要 AI 算法、边缘计算等技术综合处理。
最终画面(尤其是 3D 画面)与多维场景展示的实时性,需要大量场景计算能力,使用户获得逼真流畅的感受。
从语音技术开源、浏览器标准化,到云服务化与实时互动融合,RTC 经历了四个关键阶段
GIPS(Global IP Sound)成立于 1999 年,专注 VoIP 与语音信号处理,凭借弱网下低延迟、高音质的表现被 WebEx、Skype 采用。2010 年谷歌收购并开源其核心代码,拉开了实时音视频行业的序幕。
WebRTC 是支持浏览器实时音视频通话的 W3C JavaScript API,涵盖采集、编解码、传输与渲染。伴随移动互联网与 4G/5G 普及,大量开发者基于 WebRTC 构建实时互动应用。
自建 WebRTC 需处理服务器、全球传输与多端兼容,门槛很高。RTC PaaS 将实时通信作为云服务提供,调用 API 即可接入。声网是首个以 PaaS 形式提供实时音视频的服务商,也是全球最大的 RTC PaaS 服务商之一。
开发者需要美颜、变声、空间音频等更丰富的互动体验。声网提出 RTE(Real-Time Engagement,实时互动),提供可按场景自由组合的实时互动能力,如今正进一步与 AI 融合,支撑人与智能体的实时多模态对话。
一次实时音视频通话,要经过采集、前处理、编码、传输、解码、后处理与渲染等环节协同完成
从麦克风、摄像头等设备获取音频和视频数据,在移动端可通过操作系统 API(如 Android 的 MediaRecorder、Camera)实现。
对采集数据进行优化:音频需要降噪、回声消除以提升清晰度;视频需要美颜、滤镜、去噪等处理。
将原始音视频信号压缩为数字编码,需在实时性要求下完成,平衡编码效率与质量。
编码后的数据需传输到接收端,分为两个阶段:
将接收到的编码数据还原为可播放的音视频信号,需要高效算法与硬件支持。
“专线级”质量保证全球实时互动体验
RTC 领域唯一的全球化服务团队,在全球超过 10 个区域设有办公室,提供就近的本地化专业服务。
覆盖全球 200+ 国家和地区,80% 丢包情况下保障音视频通话流畅;连续 8 年无全网事故,全年可用时间高达 99.99%。
覆盖 30+ 平台开发框架、30000+ 移动终端,满足海外区域复杂的平台及机型适配要求。
新一代凤鸣 AI 引擎,提供更纯净、更动听、更沉浸的音频互动体验;新一代超级画质技术,提供低码高清、极速出图和多维画质增强。
丰富的场景化经验,提供灵活的 API 组合,快速上线场景和玩法;基于大量海外客户经验,提供各类场景的最佳实践。
通过 ISO 27001/27017/27018/27701 认证,完成 SOC2“信任服务”鉴证;符合 GDPR、CCPA、COPPA、HIPAA,以及中国数据安全法、网络安全法、个人信息保护法、未成年人保护法等法规要求。
一套 API 即可接入实时音视频。选择你的开发框架,复制示例代码,最快 15 分钟跑通 Demo。
// Android · Java — 初始化并加入 RTC 频道
import io.agora.rtc2.ChannelMediaOptions;
import io.agora.rtc2.Constants;
import io.agora.rtc2.RtcEngine;
import io.agora.rtc2.RtcEngineConfig;
import io.agora.rtc2.video.VideoCanvas;
RtcEngineConfig config = new RtcEngineConfig();
config.mContext = getBaseContext();
config.mAppId = appId;
config.mEventHandler = mRtcEventHandler;
mRtcEngine = RtcEngine.create(config);
mRtcEngine.enableVideo();
mRtcEngine.setupLocalVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_FIT, 0));
mRtcEngine.startPreview();
ChannelMediaOptions options = new ChannelMediaOptions();
options.clientRoleType = Constants.CLIENT_ROLE_BROADCASTER;
options.channelProfile = Constants.CHANNEL_PROFILE_LIVE_BROADCASTING;
options.publishMicrophoneTrack = true;
options.publishCameraTrack = true;
options.autoSubscribeAudio = true;
options.autoSubscribeVideo = true;
mRtcEngine.joinChannel(token, channelName, 0, options);
// iOS · Swift — 初始化并加入 RTC 频道
import AgoraRtcKit
agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: <#Your App ID#>, delegate: self)
agoraKit.enableVideo()
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.view = localView
videoCanvas.renderMode = .hidden
agoraKit.setupLocalVideo(videoCanvas)
agoraKit.startPreview()
let options = AgoraRtcChannelMediaOptions()
options.channelProfile = .liveBroadcasting
options.clientRoleType = .broadcaster
options.publishMicrophoneTrack = true
options.publishCameraTrack = true
options.autoSubscribeAudio = true
options.autoSubscribeVideo = true
agoraKit.joinChannel(byToken: <#Your Token#>, channelId: <#Your Channel Name#>, uid: 0, mediaOptions: options)
// macOS · Swift — 初始化并加入 RTC 频道
import AgoraRtcKit
import Cocoa
agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: <#Your App ID#>, delegate: self)
agoraKit.enableVideo()
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.uid = 0
videoCanvas.renderMode = .hidden
videoCanvas.view = localView
agoraKit.setupLocalVideo(videoCanvas)
agoraKit.startPreview()
let options = AgoraRtcChannelMediaOptions()
options.channelProfile = .liveBroadcasting
options.clientRoleType = .broadcaster
options.publishMicrophoneTrack = true
options.publishCameraTrack = true
options.autoSubscribeAudio = true
options.autoSubscribeVideo = true
agoraKit.joinChannel(byToken: <#Your Token#>, channelId: <#Your Channel Name#>, uid: 0, mediaOptions: options)
// Web · JavaScript — 加入视频通话频道
import AgoraRTC from "agora-rtc-sdk-ng";
const options = { appId, channel, token, uid };
const client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });
await client.join(options.appId, options.channel, options.token, options.uid);
const localAudioTrack = await AgoraRTC.createMicrophoneAudioTrack();
const localVideoTrack = await AgoraRTC.createCameraVideoTrack();
await client.publish([localAudioTrack, localVideoTrack]);
// Windows · C++ — 初始化并加入 RTC 频道
#include <IAgoraRtcEngine.h>
using namespace agora::rtc;
m_rtcEngine = createAgoraRtcEngine();
RtcEngineContext context;
context.appId = APP_ID;
context.eventHandler = &m_eventHandler;
m_rtcEngine->initialize(context);
m_rtcEngine->enableVideo();
VideoCanvas canvas;
canvas.renderMode = RENDER_MODE_TYPE::RENDER_MODE_HIDDEN;
canvas.uid = 0;
canvas.view = m_staLocal.GetSafeHwnd();
m_rtcEngine->setupLocalVideo(canvas);
m_rtcEngine->startPreview();
ChannelMediaOptions options;
options.channelProfile = CHANNEL_PROFILE_LIVE_BROADCASTING;
options.clientRoleType = CLIENT_ROLE_BROADCASTER;
options.publishMicrophoneTrack = true;
options.publishCameraTrack = true;
options.autoSubscribeAudio = true;
options.autoSubscribeVideo = true;
m_rtcEngine->joinChannel(token, channelName, 0, options);
// HarmonyOS NEXT · ArkTS — 加入 RTC 频道
import { ChannelMediaOptions, Constants, RtcEngine, RtcEngineConfig, VideoCanvas } from "@shengwang/rtc-full";
import { common } from "@kit.AbilityKit";
let config: RtcEngineConfig = new RtcEngineConfig();
config.mContext = getContext(this) as common.UIAbilityContext;
config.mAppId = "<#Your App ID#>";
this.rtcEngine = RtcEngine.create(config);
this.rtcEngine.enableVideo();
let option: ChannelMediaOptions = new ChannelMediaOptions();
option.autoSubscribeAudio = true;
option.autoSubscribeVideo = true;
option.publishCameraTrack = true;
option.publishMicrophoneTrack = true;
option.channelProfile = Constants.ChannelProfile.LIVE_BROADCASTING;
option.clientRoleType = Constants.ClientRole.BROADCASTER;
this.rtcEngine.joinChannelWithOptions(<#Your Token#>, <#Your Channel Name#>, 0, option);
// Windows · C# — 初始化并加入 RTC 频道
using Agora.Rtc;
IRtcEngine engine_ = RtcEngine.CreateAgoraRtcEngine();
engine_.Initialize(new RtcEngineContext { appId = APP_ID });
engine_.EnableVideo();
VideoCanvas canvas = new VideoCanvas();
canvas.view = (long)videoboxLocal.Handle;
canvas.renderMode = RENDER_MODE_TYPE.RENDER_MODE_FIT;
engine_.SetupLocalVideo(canvas);
engine_.StartPreview(VIDEO_SOURCE_TYPE.VIDEO_SOURCE_CAMERA_PRIMARY);
ChannelMediaOptions options = new ChannelMediaOptions();
options.channelProfile.SetValue(CHANNEL_PROFILE_TYPE.CHANNEL_PROFILE_LIVE_BROADCASTING);
options.clientRoleType.SetValue(CLIENT_ROLE_TYPE.CLIENT_ROLE_BROADCASTER);
options.publishMicrophoneTrack = true;
options.publishCameraTrack = true;
options.autoSubscribeAudio = true;
options.autoSubscribeVideo = true;
engine_.JoinChannel(APP_TOKEN, channelName, 0, options);
// 微信小程序 · JavaScript — Promise 方式加入并发布
const AgoraMiniappSDK = require("agora-miniapp-sdk");
try {
let client = new AgoraMiniappSDK.Client();
await client.init(APPID);
await client.setRole("broadcaster");
await client.join(yourToken, channel, uid);
const url = await client.publish();
} catch (e) {
console.error(e);
}
// Electron · JavaScript — renderer.js 核心代码
const { createAgoraRtcEngine, ChannelProfileType, ClientRoleType, VideoSourceType, VideoViewSetupMode } = require("agora-electron-sdk");
let rtcEngine = createAgoraRtcEngine();
rtcEngine.initialize({ appId: APPID, logConfig: { filePath: sdkLogPath } });
rtcEngine.registerEventHandler({
onJoinChannelSuccess: ({ channelId }) => {
rtcEngine.setupLocalVideo({ sourceType: VideoSourceType.VideoSourceCameraPrimary, uid, view: localVideoContainer, setupMode: VideoViewSetupMode.VideoViewSetupAdd });
},
onUserJoined: ({ channelId }, remoteUid) => {
rtcEngine.setupRemoteVideo({ sourceType: VideoSourceType.VideoSourceRemote, uid: remoteUid, view: remoteVideoContainer, setupMode: VideoViewSetupMode.VideoViewSetupAdd }, { channelId });
}
});
rtcEngine.enableVideo();
rtcEngine.startPreview();
rtcEngine.joinChannel(token, channel, uid, {
channelProfile: ChannelProfileType.ChannelProfileLiveBroadcasting,
clientRoleType: ClientRoleType.ClientRoleBroadcaster,
publishMicrophoneTrack: true, publishCameraTrack: true,
autoSubscribeAudio: true, autoSubscribeVideo: true,
});
// Unity · C# — Join 方法
using Agora.Rtc;
public void Join()
{
ChannelMediaOptions options = new ChannelMediaOptions();
options.publishMicrophoneTrack.SetValue(true);
options.publishCameraTrack.SetValue(true);
options.autoSubscribeAudio.SetValue(true);
options.autoSubscribeVideo.SetValue(true);
options.channelProfile.SetValue(CHANNEL_PROFILE_TYPE.CHANNEL_PROFILE_LIVE_BROADCASTING);
options.clientRoleType.SetValue(CLIENT_ROLE_TYPE.CLIENT_ROLE_BROADCASTER);
RtcEngine.JoinChannel(_token, _channelName, 0, options);
}
// Flutter · Dart — 初始化并加入 RTC 频道
import 'package:agora_rtc_engine/agora_rtc_engine.dart';
final _engine = createAgoraRtcEngine();
await _engine.initialize(const RtcEngineContext(appId: appId));
await _engine.enableVideo();
await _engine.startPreview();
await _engine.joinChannel(
token: token, channelId: channel, uid: 0,
options: const ChannelMediaOptions(
autoSubscribeVideo: true, autoSubscribeAudio: true,
publishCameraTrack: true, publishMicrophoneTrack: true,
clientRoleType: ClientRoleType.clientRoleBroadcaster,
),
);
// React Native · TypeScript — 初始化并加入 RTC 频道
import { createAgoraRtcEngine, ChannelProfileType, ClientRoleType } from 'react-native-agora';
const engine = createAgoraRtcEngine();
engine.initialize({ appId });
engine.enableVideo();
engine.startPreview();
engine.joinChannel(token, channelName, uid, {
channelProfile: ChannelProfileType.ChannelProfileLiveBroadcasting,
clientRoleType: ClientRoleType.ClientRoleBroadcaster,
publishMicrophoneTrack: true, publishCameraTrack: true,
autoSubscribeAudio: true, autoSubscribeVideo: true,
});
// Unreal Engine · C++ — Join 方法核心代码
RtcEngineProxy->enableVideo();
agora::rtc::ChannelMediaOptions options;
options.autoSubscribeAudio = true;
options.autoSubscribeVideo = true;
options.publishCameraTrack = true;
options.publishMicrophoneTrack = true;
options.channelProfile = agora::CHANNEL_PROFILE_TYPE::CHANNEL_PROFILE_LIVE_BROADCASTING;
options.clientRoleType = agora::rtc::CLIENT_ROLE_TYPE::CLIENT_ROLE_BROADCASTER;
RtcEngineProxy->joinChannel(TCHAR_TO_ANSI(*_token), TCHAR_TO_ANSI(*_channelName), 0, options);
// Unreal Engine · Blueprint — 官方流程
// 1. 调用 Enable Video / Enable Audio
// 2. 调用 Join Channel
// 3. Make ChannelMediaOptions 中设置:
// Publish Camera Track / Publish Microphone Track = AGORA TRUE VALUE
// Auto Subscribe Video / Auto Subscribe Audio = AGORA TRUE VALUE
// Client Role Type = CLIENT_ROLE_BROADCASTER
// Channel Profile = CHANNEL_PROFILE_LIVE_BROADCASTING
// 4. 结束时调用 Leave Channel
// React · agora-rtc-react — Hooks 方式加入频道
import AgoraRTC, { AgoraRTCProvider } from "agora-rtc-react";
import { useJoin, useLocalMicrophoneTrack, useLocalCameraTrack, usePublish } from "agora-rtc-react";
const client = AgoraRTC.createClient({ mode: "rtc", codec: "vp8" });
// 在 AgoraRTCProvider 包裹的组件内:
useJoin({ appid: appId, channel: channel, token: token ? token : null }, calling);
const { localMicrophoneTrack } = useLocalMicrophoneTrack(micOn);
const { localCameraTrack } = useLocalCameraTrack(cameraOn);
usePublish([localMicrophoneTrack, localCameraTrack]);
// Electron for 统信OS · JavaScript — 同 Electron SDK 接入流程
const { createAgoraRtcEngine, ChannelProfileType, ClientRoleType, VideoSourceType, VideoViewSetupMode } = require("agora-electron-sdk");
let rtcEngine = createAgoraRtcEngine();
rtcEngine.initialize({ appId: APPID, logConfig: { filePath: sdkLogPath } });
rtcEngine.enableVideo();
rtcEngine.startPreview();
rtcEngine.joinChannel(token, channel, uid, {
channelProfile: ChannelProfileType.ChannelProfileLiveBroadcasting,
clientRoleType: ClientRoleType.ClientRoleBroadcaster,
publishMicrophoneTrack: true, publishCameraTrack: true,
autoSubscribeAudio: true, autoSubscribeVideo: true,
});
覆盖泛娱乐、出海、教育、企业数字化等行业
经过连麦 PK、视频聊天等社交场景的打磨,声网逐渐形成一套成熟的“泛社交场景化解决方案”,助力陌陌推出多人缘分交友、语音电台、才艺广场等更多创新玩法。
在声网在线 K 歌解决方案支持下,唱吧推出在线 K 歌、连麦合唱、直播等核心玩法,用户在不同网络环境下也能获得良好的连麦 K 歌体验,实现用户数量、使用时长和营收多重增长。
使用声网直播 SDK 后,荔枝在商业化上取得新突破:上线 8 个月后,语音直播打赏收入已超过原先的广告销售业务。
Soul 对 K 歌音质、合唱延迟、听众同步体验及稳定性要求严苛,声网为其快速构建完整的在线 K 歌房,提供曲库、播放、歌词、嗨歌、3A 等 K 歌必要组件。
声网在超低延时互动、弱网对抗、设备适配等方面为 Yalla 提供最优方案和服务,为其成为中东北非地区最具影响力的社交娱乐平台打下坚实技术基础。
Kumu 先后上线视频直播、连麦直播、直播答题、语音直播、电商直播、直播 PK 等多种场景,实现“打造菲律宾本土内容社交平台,帮助内容创作者展示才华、创造收入”的目标。
通过搭载声网 3D 空间音频,Oasis 用户操控 Avatar 在虚拟场景中移动时,可根据面部朝向、音源方向、远近距离与上下高度,真实模拟现实听觉感受。
Shopee 对音视频传输质量要求高,网络架构需应对 10 倍以上负荷并支持首帧秒开。接入声网电商直播连麦方案后,满足了其高流畅、高稳定、高并发的需求。
新冠期间,声网为新东方提供底层实时音视频支持,在突发流量、资源紧张的情况下快速平稳扩容,上线后零故障,7 天内将旗下 80 多个分校和子机构的上百万师生搬到线上“新东方云教室”。
疫情期间,智慧树上线在线语音 + 课件共享的直播课堂,免费提供给高校师生,借助声网 RTC 实现流畅高效的线上教学互动,保障“停课不停学”。
通过声网视频通话 SDK,监考人员可在考试过程中实时查看画面并与考生视频通话,让远程监考更高效便捷,同时保障双方互动体验。
声网结合金融场景对交互、安全合规的需求,帮助诺亚财富快速上线流畅稳定的视频直播互动营销方案,支持精细化运营与可视化数据管理,实现“直播 + 营销”闭环。
声网为华晨宝马提供远程协作方案:维修工人戴上 AR 眼镜开启音视频互动,专家即可借助 3D 标注、画面缩放等功能快速精准地给出维修指导。
招商金科助力招商局集团推出“招商随行”工作协同平台并上线“随行会议”,底层基于声网 RTC 技术框架,实现自主可控、个性化定制的音视频会议服务。
声网为众安保险“远程定损理赔”提供技术支撑,车主通过 APP 或小程序实时视频连线定损客服,在一次视频通话中完成从报案到核赔的车险理赔流程。
WebRTC 是谷歌开源的一套浏览器实时音视频标准与 API;RTC 是实时通信技术的统称。基于开源 WebRTC 自研需要自行解决服务器部署、全球网络传输、弱网对抗和多端兼容等问题,而声网这类 RTC PaaS 服务通过 SDK 和全球网络提供开箱即用的能力,并与 WebRTC 互通。
声网 RTC 兼容 HarmonyOS、iOS、Android、Windows、macOS、Web、小程序、RTOS、Electron、Flutter、React Native、Unity、Cocos 等 30+ 平台语言,并已适配 30000+ 款移动终端。
声网通过全球软件定义实时网络、智能动态路由和抗丢包算法,在 80% 丢包的网络条件下仍可保障音视频通话流畅。
注册账号并获取 App ID 后,参考官方文档与示例代码,开发者通常可在较短时间内跑通基础音视频通话;声网还提供场景化方案与 1v1 集成顾问,帮助业务快速上线。
声网已通过 ISO 27001/27017/27018/27701 认证并完成 SOC2 鉴证,符合 GDPR、CCPA、COPPA、HIPAA,以及中国数据安全法、网络安全法、个人信息保护法、未成年人保护法等法规要求。详见 安全合规。