webrtc网页端拉流流程

webrtc网页端拉流流程

webrtc拉流工作流程

1. WHEP信令交换

请求内容:

服务器处理,ZLMediaKit 收到 Offer,解析浏览器支持的编解码(本例中双方都支持 H264),生成 SDP Answer。

响应内容:

SDP Answer 中包含的关键信息:

  • a=ice-lite 表示服务器使用 ICE-lite 模式
  • a=sendonly 表示服务器只发送媒体(对应浏览器的 recvonly)
  • a=candidate:... udp 110 54.xx.xx.xx 8000 typ host 告诉浏览器服务器的 UDP 地址
  • a=fingerprint:sha-256 ... 服务器 DTLS 证书的指纹
  • a=setup:passive 服务器是 DTLS 被动方
  • a=rtpmap:103 H264/90000 协商使用 H264 编解码

2. ICE 连通性检查(UDP 层)

ZLMediaKit 使用 ICE-lite 模式。ICE-lite 的含义是:服务器有固定的公网 IP,不需要做 NAT 穿透,只需要被动等待浏览器的连通性检查。

过程:

  1. 浏览器向信令服务器发送STUN Binding Request(UDP 包)。
  2. 信令服务器收到以后回复STUN Binding Response。
  3. 浏览器确认连通性,ICE 状态从 new 变为 checking 再变为 connected/completed。

3. DTLS握手

流程:

  1. 浏览器发送 DTLS ClientHello。
  2. 服务器回复 ServerHello + Certificate + ServerKeyExchange + CertificateRequest + ServerHelloDone。
  3. 浏览器发送 Certificate + ClientKeyExchange + CertificateVerify + ChangeCipherSpec + Finished。
  4. 服务器发送 ChangeCipherSpec + Finished。
  5. 握手完成后: 双方验证对方的证书指纹是否与 SDP 中的 fingerprint 匹配。 协商出 SRTP 加密套件(本例中为 SRTP_AEAD_AES_256_GCM)。 导出 SRTP 加密密钥。

完成以上步骤以后,流媒体服务器开始通过 SRTP(加密的 RTP)向浏览器发送音视频数据
关闭播放时,播放器向 SDP Answer 响应头中 Location 字段指定的 URL 发送 DELETE 请求:

ZLMediaKit的部署

ZLMediaKit是一个高性能流媒体服务器,基于C++11开发,支持二次开发,对webrtc的支持很好,也支持其他音视频协议。

1. ZLMediaKit编译注意事项

编译时需要注意加上编译选项

ini 复制代码
cmake .. -DENABLE_WEBRTC=ON -DENABLE_OPENSSL=ON

-DENABLE_WEBRTC=ON 开启 WebRTC 功能支持。如果不加这个参数,编译出来的程序不支持 WebRTC/WHEP。
-DENABLE_OPENSSL=ON 开启 OpenSSL 支持,用于 HTTPS 和 DTLS。

开启ENABLE_WEBRTC=ON选项之后可能会提示缺少srtp,webrtc模块无效,此时需要自己去网上拉取libstrp2的安装包,并且安装到服务器,需要注意的是一定要libstrp2,不能是libstrp3,ZLMediaKit不支持libstrp3

编译完成后,可执行文件在以下路径:

~/ZLMediaKit/release/linux/Debug/MediaServer

2. 配置ZLMediaKit服务参数

配置文件路径:~/ZLMediaKit/release/linux/Debug/config.ini

ini 复制代码
[http]  
port=80  
sslport=443  
allow_cross_domains=1 #开启跨域
allow_ip_range=0.0.0.0/0 #让所有ip都可以访问
[rtc]    
externIP=[服务器公网IP]   
port=8000
启动命令:

这样可以后台打开日志,并且指定是按照当前目录下的config.ini启动

bash 复制代码
cd ~/ZLMediaKit/release/linux/Debug
sudo ./MediaServer -c ./config.ini -d &

需要关闭就执行 killall MediaServer

相关推荐
Java内核笔记17 分钟前
Spring Boot 4 拥抱 Jackson 3:包名迁移、配置改名与自动配置源码剖析
java·后端
Hamm33 分钟前
前端转Java+AI全栈?那我推荐几个实战开源项目给你
前端·后端·全栈
凤山老林1 小时前
Spring Boot 定时任务进阶:动态 Cron 与集群防重实战
java·spring boot·后端·定时任务·集群定时任务
站大爷IP2 小时前
被 `asyncio.gather` 和 `wait` 坑惨了:异常处理的天壤之别
后端
张龙6872 小时前
Docker 镜像瘦身实战:从 1.2GB 到 128MB,我踩过的 7 个坑和一套可复制的方法论
运维·后端·docker
lizhongxuan3 小时前
工程技术:在智能体优先的世界中利用 Codex(转)
后端
程序员cxuan4 小时前
Pi + DeepSeek-v4-Flash,这用着也太爽了。
人工智能·后端·程序员
进击的程序猿~5 小时前
Go Interface源码深度解析指南
开发语言·后端·golang
qo_tn5 小时前
微信机器人-webhook技术文档_04-Docker-Compose部署与生产化配置
后端
程序员cxuan5 小时前
Claude Opus 5 的系统提示词被扒出来了
人工智能·后端·程序员