webrtc网页端拉流流程
webrtc拉流工作流程
1. WHEP信令交换
请求内容:
- 方法:POST
- URL:https://54.92.84.25/index/api/whep?app=live&stream=test&type=play
- Content-Type: application/sdp
- Body:浏览器的 SDP Offer(包含浏览器支持的编解码格式、ICE 候选地址、DTLS 证书指纹等)
服务器处理,ZLMediaKit 收到 Offer,解析浏览器支持的编解码(本例中双方都支持 H264),生成 SDP Answer。
响应内容:
- Status: 201 Created
- Content-Type: application/sdp
- Location: https://54.92.84.25/index/api/delete_webrtc?id=xxx(用于后续关闭会话)
- Body:服务器的 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 穿透,只需要被动等待浏览器的连通性检查。
过程:
- 浏览器向信令服务器发送STUN Binding Request(UDP 包)。
- 信令服务器收到以后回复STUN Binding Response。
- 浏览器确认连通性,ICE 状态从 new 变为 checking 再变为 connected/completed。
3. DTLS握手
流程:
- 浏览器发送 DTLS ClientHello。
- 服务器回复 ServerHello + Certificate + ServerKeyExchange + CertificateRequest + ServerHelloDone。
- 浏览器发送 Certificate + ClientKeyExchange + CertificateVerify + ChangeCipherSpec + Finished。
- 服务器发送 ChangeCipherSpec + Finished。
- 握手完成后: 双方验证对方的证书指纹是否与 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