跳转到内容

WebTransport 协议

WebTransport 是基于 QUIC 协议(HTTP/3)的新一代 Web 传输技术。相比 WebSocket,它提供更低的延迟、原生多路复用和无队头阻塞特性,是面向未来的 Web 流媒体传输方案。

属性
默认端口4433
传输层QUIC(HTTP/3)
推流✅ 支持
拉流✅ 支持
延迟< 500ms
Feature Flagwebtransport
Cargo.toml
[features]
webtransport = ["dep:plugin-webtransport"]
webtransport:
enable: true
listen_addr: "0.0.0.0:4433"
cert_file: ""
key_file: ""
max_streams: 100
enable_datagrams: true
max_datagram_size: 65535
idle_timeout: 30
allowed_origins: []
配置项类型默认值说明
enablebooltrue是否启用插件
listen_addrstring"0.0.0.0:4433"监听地址
cert_filestring""TLS 证书文件路径
key_filestring""TLS 私钥文件路径
max_streamsu32100每连接最大并发流数
enable_datagramsbooltrue启用 Datagram 支持
max_datagram_sizeusize65535最大 Datagram 大小
idle_timeoutu6430空闲超时(秒)
allowed_originsVec[]允许的跨域来源

WebTransport 基于 QUIC,要求 TLS 加密传输。

使用自签名证书(开发环境):

如果不配置 cert_filekey_file,插件会自动生成自签名证书。

使用正式证书(生产环境):

webtransport:
cert_file: "/etc/ssl/certs/server.crt"
key_file: "/etc/ssl/private/server.key"

支持 Let’s Encrypt 等 CA 签发的证书。

WebTransport 是较新的 Web API,目前支持情况:

浏览器支持版本
Chrome97+
Edge97+
Firefox114+
Safari不支持(截至 2025)
Opera83+
async function publish(streamPath) {
const url = `https://localhost:4433/publish/${streamPath}`;
const transport = new WebTransport(url);
await transport.ready;
console.log('WebTransport 连接已建立');
// 获取摄像头
const stream = await navigator.mediaDevices.getUserMedia({
video: true,
audio: true,
});
// 通过双向流发送媒体数据
const bidiStream = await transport.createBidirectionalStream();
const writer = bidiStream.writable.getWriter();
// 发送媒体数据...
// 具体编码和封装逻辑取决于应用层协议
transport.closed.then(() => {
console.log('WebTransport 连接已关闭');
});
}
publish('live/test');
async function subscribe(streamPath) {
const url = `https://localhost:4433/subscribe/${streamPath}`;
const transport = new WebTransport(url);
await transport.ready;
console.log('WebTransport 连接已建立');
// 读取服务端推送的数据
const reader = transport.incomingBidirectionalStreams.getReader();
while (true) {
const { value: stream, done } = await reader.read();
if (done) break;
// 处理接收到的媒体数据
const streamReader = stream.readable.getReader();
while (true) {
const { value, done } = await streamReader.read();
if (done) break;
// 解码并渲染...
}
}
}
subscribe('live/test');

Datagram 模式适合对实时性要求极高、可容忍少量丢包的场景:

const transport = new WebTransport(url);
await transport.ready;
// 发送 Datagram
const writer = transport.datagrams.writable.getWriter();
await writer.write(new Uint8Array([/* 媒体数据 */]));
// 接收 Datagram
const reader = transport.datagrams.readable.getReader();
const { value } = await reader.read();
特性WebTransportWebRTC
底层协议QUIC (HTTP/3)ICE/DTLS/SRTP
连接建立简单(HTTP 升级)复杂(ICE + SDP 交换)
NAT 穿透不需要(类 HTTP)需要 STUN/TURN
多路复用原生支持不支持
有序/无序均支持部分支持
服务端要求需要 TLS 证书需要 STUN/TURN 服务
浏览器支持较新成熟
  • 已有 HTTPS 基础设施:优先选择 WebTransport
  • 需要 P2P 通信:选择 WebRTC
  • 需要最大浏览器兼容:选择 WebRTC
  • 追求架构简洁:选择 WebTransport

WebTransport 推入的流可以通过其他协议播放:

Terminal window
# 通过 RTMP 拉流
ffplay rtmp://localhost:1935/live/test
# 通过 HTTP-FLV 拉流
ffplay http://localhost:8080/flv/live/test.flv
# 通过 HLS 拉流
ffplay http://localhost:8080/hls/live/test/index.m3u8

联系我们

微信公众号:不卡科技 微信公众号二维码
腾讯频道:流媒体技术 腾讯频道二维码
QQ 频道:p0qq0crz08 QQ 频道二维码
QQ 群:751639168 QQ 群二维码