WebRTC是一种开放技术,用于在设备之间直接实时传输音频、视频和数据,无需中间服务器。根据WebRTC Project (2026),该标准受到所有现代浏览器和移动平台的支持,延迟低于500毫秒。WebRTC使用ICE、STUN、TURN协议,即使在NAT和防火墙后面也能建立连接。
要点
WebRTC(Web Real-Time Communication)是一个开源项目,由Google于2011年发起,并由W3C(JavaScript API)和IETF(协议)标准化。主要任务是在浏览器和应用之间提供低延迟通信,无需安装插件或第三方软件。
与传统解决方案(RTMP、HLS)不同,在传统方案中视频通过服务器传输,而WebRTC使用点对点架构:数据直接在参与者之间传输。这提供了200-500毫秒的延迟,而HLS为3-10秒——对于语音和视频通话、游戏流媒体和远程手术来说,这是关键区别。
根据Google WebRTC Team(2025)的数据,该技术被用于总安装量超过50亿的应用中:Google Meet、WhatsApp、Discord、Telegram、Zoom(部分)。超过85%的远程医疗和教育科技领域的风险投资初创公司选择WebRTC作为主要的实时传输方式。
移动开发在2013年随着libjingle_peerconnection的发布获得了完全功能的WebRTC——这是Android和iOS的原生实现。目前两个平台都拥有稳定的SDK,支持H.264和VP8的硬件编码、摄像头、麦克风和设备的扬声器。
WebRTC架构由三个层次组成。上层——JavaScript API(或移动平台的原生API),中层——传输协议,下层——编解码器和安全性。每层解决自己的任务,但所有层都是建立连接所必需的。
MediaStream(getUserMedia)——从设备的麦克风和摄像头捕获音频和视频。RTCPeerConnection——管理P2P连接:编码、传输、比特率自适应。RTCDataChannel——通过同一通道传输任意数据(文本、文件、二进制消息)。
// JavaScript API WebRTC(浏览器示例)
const pc = new RTCPeerConnection({
iceServers: [
{ urls: "stun:stun.l.google.com:19302" }
]
});
pc.onicecandidate = (event) => {
if (event.candidate) {
sendToPeer(JSON.stringify(event.candidate));
}
};
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
WebRTC使用SRTP(安全实时传输协议)用于音频和视频——具有AES-128加密的RTP安全版本。会话管理通过SCTP(流控制传输协议)经由DTLS进行。每个数据流都必须加密:WebRTC中没有不安全模式。
WebRTC的主要技术难点是在位于NAT(网络地址转换)后面的设备之间建立P2P连接。没有特殊机制,设备无法直接相互访问,因为它们的本地IP地址在互联网上不可见。
STUN(NAT会话穿越工具)——回答“我的公网IP和端口是什么?”问题的服务器。客户端向STUN服务器发送请求,服务器看到其公网地址并返回给客户端。Google公开维护STUN服务器stun:stun.l.google.com:19302。
// iOS上的WebRTC——配置ICE服务器
import WebRTC
let config = RTCConfiguration()
config.iceServers = [
RTCIceServer(
urlStrings: ["stun:stun.l.google.com:19302"]
),
RTCIceServer(
urlStrings: ["turn:turn.example.com:3478"],
username: "user",
credential: "password"
)
]
let pc = RTCPeerConnection(configuration: config)
TURN(使用中继绕过NAT)——用于STUN无法帮助的情况的转发服务器(对称NAT或企业防火墙)。在此模式下,所有数据通过TURN服务器传输——这降低了速度并增加了延迟,但保证了99%情况下的连接。
TURN是WebRTC基础设施中最昂贵的组件,因为服务器需要转发所有媒体流量。根据Coturn Project(2025),一个典型的具有8个vCPU和16GB RAM的TURN服务器可处理约200个同时音频通话或40个HD质量的视频通话。
ICE收集所有可能的候选者(本地IP、通过STUN获取的公网IP、通过TURN获取的中继),并按照优先级尝试建立连接。只要至少一对候选者(本地-远程)通过连通性检查connectivity check,连接即被视为已建立。
对于移动开发,Google维护libWebRTC——适用于Android(AAR)和iOS(XCFramework)的原生库。该库包含完整的协议栈、编解码器(VP8、VP9、H.264、AV1)和硬件编码/解码加速。
Android SDK提供PeerConnectionFactory、PeerConnection、MediaStream类。应用程序创建工厂,配置视频编解码器,通过VideoCapturer捕获摄像头流,并通过SDP offer/answer建立点对点连接。
// Android WebRTC——初始化
import org.webrtc.*;
PeerConnectionFactory.Initialize(PeerConnectionFactory.InitializationOptions
.builder(context)
.setFieldTrials("WebRTC-H264-HighProfile/Enabled/")
.createInitializationOptions());
PeerConnectionFactory factory =
PeerConnectionFactory.builder()
.setVideoDecoderFactory(new DefaultVideoDecoderFactory(eglBase))
.setVideoEncoderFactory(new DefaultVideoEncoderFactory(eglBase, true, true))
.createPeerConnectionFactory();
iOS SDK使用带有RTCPeerConnectionFactory、RTCCameraVideoCapturer、RTCVideoTrack包装器的Objective-C API。H.264的硬件编码通过VideoToolbox可用。视频显示使用RTCMTLVideoView(Metal)或RTCVideoRenderer。
// iOS WebRTC——从摄像头捕获视频
let factory = RTCPeerConnectionFactory()
let capturer = RTCCameraVideoCapturer(delegate: factory)
// 选择摄像头(前/后)
guard let device = RTCCameraVideoCapturer
.captureDevices().first(where: {
$0.position == .front
}) else { return }
// 以最大FPS启动捕获
capturer.startCapture(
with: device,
format: RTCCameraVideoCapturer
.supportedFormats(for: device).last!,
fps: 30
)
对于生产环境中的视频通话,移动应用通常使用基于libWebRTC的SDK包装器:Twilio Video、Agora、Daily.co。这些SDK简化了信令、房间管理,并提供了用于显示参与者视频网格的现成UI组件。
WebRTC不指定信令协议——对等体之间的SDP(会话描述协议)消息交换。开发者自己选择信令的传输方式:WebSocket、MQTT、SIP、XMPP或REST API。信令将offer、answer和ICE候选者从一个对等体传送到另一个对等体。
过程从创建offer开始(发起者描述其媒体能力),通过信令传输给第二个对等体,第二个对等体以answer响应。交换SDP后,每个对等体启动ICE并开始DTLS-SRTP以加密流。
// Android——创建和发送offer
private fun startCall(peerConnection: PeerConnection) {
val constraints = MediaConstraints().apply {
mandatory["OfferToReceiveAudio"] = "true"
mandatory["OfferToReceiveVideo"] = "true"
}
peerConnection.createOffer(object : SdpObserver {
override fun onCreateSuccess(sdp: SessionDescription) {
peerConnection.setLocalDescription(this, sdp)
// 将sdp.description发送到信令服务器
sendSdpOffer(sdp.description)
}
}, constraints)
}
在移动应用中,最流行的是通过WebSocket进行信令——一种通过TCP的双向通道,与服务器保持持久连接。信令服务器通常是一个独立的微服务(Node.js、Golang、Elixir),在房间参与者之间路由消息。
ICE和DTLS-SRTP完成后,信令不再参与数据传输——所有媒体流量直接点对点(或通过TURN中继)进行。信令服务器可以在不中断活跃通话的情况下关闭。这是WebRTC去中心化架构的关键优势。
常见问题
RTMP和HLS是服务器协议,延迟3-10秒,所有数据通过服务器传输。WebRTC是点对点,延迟200-500毫秒。RTMP适合面向大量观众的流媒体,WebRTC适合交互式通话和游戏。
不,TURN仅在P2P无法通过的情况下需要(对称NAT、企业防火墙)。根据Google的统计数据,约15%的连接需要TURN。对于生产环境,建议将TURN服务器作为后备方案以实现100%的可靠性。
必需的编解码器:VP8(所有平台)和H.264(在iOS/Android上具有硬件加速)。可选的:VP9(更好的压缩,更低的比特率)和AV1(超高效,但对CPU要求高)。音频:Opus(主要)和G.711(PCMU/PCMA)。
可以,通过RTCDataChannel。这是一个完全功能性的通道,用于传输任意数据:文本、文件、二进制消息。DataChannel通过SCTP工作,具有可配置的可靠性(游戏使用部分可靠传送,文件使用可靠传送)。
通过客户端的MediaRecorder API或通过SFU(选择性转发单元)——接收所有参与者流并可以录制它们的服务器。第二个选项更可靠,因为录制不依赖于参与者的设备,并且在断开连接时不会中断。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。