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

相关推荐
逝水无殇6 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
YIAN6 小时前
从手写 Agent 工具到 MCP 协议:一文搞懂大模型跨进程跨语言工具调用
后端·agent·mcp
小兔崽子去哪了7 小时前
Docker 删除镜像后磁盘空间没有释放?
后端·docker·容器
高明珠7 小时前
麒麟 V10 SP1 排查实录:ttyS5 每 10 秒莫名收到一批报文,元凶是 eGTouchD
后端
卷无止境7 小时前
Python FFI 技术深度解析:ctypes、cffi 与 pybind11 的性能差异与实践挑战
后端·python
ServBay7 小时前
AI Gateway 是什么?为什么每个平台都在做
后端·aigc·ai编程
SamDeepThinking8 小时前
Vibe Coding最重要的是Spec
后端·程序员·ai编程
掘金_答案8 小时前
上线那天,一个 ConcurrentHashMap 差点送走我的 AI 客服——3 天排查 JVM 血泪史
java·后端·架构
妙码生花8 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(三十三):权限规则管理器
后端·go·gin
Kim_wang8 小时前
agent项目部署流程
人工智能·后端