29、WebRTC标准与未来:W3C标准进展、WebCodecs与WebTransport、下一代实时通信

聊到WebRTC的未来,我其实挺感慨的。2011年我刚接触这个技术时,它还是个毛头小子,连基本的屏幕共享都费劲。现在呢?它已经成了实时通信的事实标准。但技术这东西,永远没有终点。今天我们就来聊聊WebRTC正在经历的变化,以及下一代实时通信长什么样。

W3C标准进展:WebRTC终于“转正”了

先说个好消息。WebRTC 1.0在2021年正式成为W3C推荐标准。嗯,你没看错,从2011年Chrome首次支持到正式定稿,整整花了十年。我在项目中遇到过不少团队,因为标准没定稿而不敢上生产环境,现在可以放心了。

但标准定稿不代表停滞。W3C的WebRTC工作组还在推进几个重要方向:

  • WebRTC Next Version (NV):主要解决1.0遗留的痛点,比如更灵活的SDP协商、更好的ICE性能
  • Insertable Streams (可插入流):允许开发者直接操作编码后的音视频帧,实现自定义加密、滤镜等
  • Simulcast改进:让多路流发送更高效,特别是大房间场景

核心变化:WebRTC正在从“黑盒”走向“可编程”。以前你只能调API,现在你能深入到编码层做定制。

WebCodecs:浏览器里的编解码“裸能力”

WebCodecs是我个人非常看好的一个API。它给了开发者直接访问浏览器编解码器的能力,不需要经过WebRTC的媒体管道。

为什么会需要这个?举个例子。我在做一个低延迟直播项目时,发现WebRTC的媒体管道虽然方便,但不够灵活。我想用H.265编码,但WebRTC不支持。有了WebCodecs,我可以自己控制编码器,然后把编码后的数据通过任意传输协议发送。

// 使用WebCodecs进行视频编码
const encoder = new VideoEncoder({
  output: (chunk) => {
    // 拿到编码后的数据,可以自己决定怎么传
    transport.send(chunk);
  },
  error: (e) => console.error('编码错误', e)
});

await encoder.configure({
  codec: 'vp8',
  width: 640,
  height: 480,
  bitrate: 1_000_000,
  framerate: 30
});

// 编码一帧
const frame = new VideoFrame(canvas);
encoder.encode(frame);
frame.close();

我的建议:如果你需要非标准的编解码器(比如H.265、AV1),或者想实现自定义的码率控制,WebCodecs是更好的选择。但要注意,它比WebRTC API更底层,你需要自己处理丢包、重传等逻辑。

WebTransport:取代WebSocket的新一代传输

WebTransport是另一个让我兴奋的技术。它基于QUIC协议,说白了就是HTTP/3的底层传输能力。相比WebSocket,它有几个明显优势:

  • 多路复用:一个连接可以同时传输多个独立的数据流,不会互相阻塞
  • 无序传输:可以发送不需要按序到达的数据包,适合实时游戏、视频帧
  • 更低的延迟:基于UDP,0-RTT连接建立

我曾经用WebTransport做过一个实验:把WebRTC的媒体数据通过WebTransport传输,而不是传统的SRTP/SCTP。结果在弱网环境下,延迟降低了30%左右。当然,这只是实验,生产环境还需要更多验证。

// 创建WebTransport连接
const transport = new WebTransport('https://example.com:4433');

await transport.ready;

// 创建无序数据流
const writer = transport.datagrams.writable.getWriter();
const data = new Uint8Array([1, 2, 3, 4]);
writer.write(data);

// 创建可靠数据流
const stream = await transport.createBidirectionalStream();
const reader = stream.readable.getReader();
const writer2 = stream.writable.getWriter();

注意:WebTransport目前(2024年)在Chrome和Edge中可用,但Safari和Firefox还在开发中。生产环境使用前一定要做好降级方案,比如回退到WebSocket。

下一代实时通信:WebRTC + WebCodecs + WebTransport

这三者结合起来,就是下一代实时通信的雏形。我画了一张图来展示它们的关系:

下一代实时通信架构 WebRTC 媒体协商、ICE、DTLS 标准化的实时通信管道 WebCodecs 编解码器裸能力 自定义编码/解码 WebTransport 基于QUIC的传输 多路复用、无序传输 组合应用场景 WebRTC负责信令和媒体协商 + WebCodecs处理自定义编解码 + WebTransport传输数据 低延迟直播、云游戏、远程协作、AI实时处理

说白了,未来的实时通信不再是“WebRTC包打天下”。而是根据场景选择最合适的工具:

场景 推荐方案 原因
标准视频通话 WebRTC 开箱即用,兼容性好
低延迟直播 WebCodecs + WebTransport 灵活控制编码,减少延迟
云游戏 WebCodecs + WebTransport 需要自定义帧率、码率控制
大规模会议 WebRTC + SFU 成熟的媒体路由方案
AI实时处理 WebCodecs + WebTransport 需要访问原始帧数据

避坑指南:我踩过的几个坑

最后分享几个我在探索这些新技术时遇到的坑:

  • WebCodecs的兼容性:我曾经在Safari上跑WebCodecs,结果发现它只支持部分编码器。记得用VideoEncoder.isConfigSupported()先检测一下。
  • WebTransport的端口限制:WebTransport默认使用443端口,但有些企业防火墙会拦截UDP流量。我建议同时准备一个WebSocket回退方案。
  • 不要过度设计:如果你的场景只是简单的1对1视频通话,用WebRTC就够了。别为了炫技硬上WebCodecs+WebTransport,维护成本会翻倍。

总结一下:WebRTC不会消失,但它会从“唯一选择”变成“选项之一”。WebCodecs和WebTransport给了我们更多自由度。未来五年,实时通信的边界会被大大拓宽。嗯,作为开发者,我们得跟上这个节奏。

公众号:蓝海资料掘金营,微信deep3321