1.webrtc SDP和candidate消息生成位置学习
2.WebRTCä¹STUNä¸TURN以åICE
3.CentOS7下使用SRS搭建流媒体服务器
webrtc SDP和candidate消息生成位置学习
SDP 和 candidate 消息生成代码
ICE 消息生成及发送,源码由 webrtc 原生 API RTCPeerConnection 中 onicecandidate 事件触发,源码经记录处理后,源码触发 'ice' 事件将 ICE 内容传至 Peer 对象,源码随后 Peer 对象调用信令服务器接口发送 candidate 消息。源码onicecandidate 事件触发自 icecandidate 事件,源码dz 整站源码icecandidate 事件由 RTCPeerConnection API 中 setLocalDescription 调用内部触发。源码
代码流程包括:
信令服务器发出的源码消息处理,Peer.js 中 'ice' 事件触发处理函数 onIceCandidate 的源码消息。
WebRTC 原生 API RTCPeerConnection 中 onicecandidate 事件传出的源码消息。
音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
免费分享音视频学习资料包、源码大厂面试题、源码技术视频和学习路线图,源码资料包括(C/C++,源码Linux,源码FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击 加群免费领取~
SDP 消息生成
offer 消息生成,加入房间时,gpt官方源码SimpleWebrtc 会调用 webrtc.js 中的 createPeer 函数生成 peer,随后 Peer 对象创建成功后,Simplewebrtc.js 会调用 Peer.start(),主动调用 PeerConnection.prototype.offer,该方法内部调用原生 webrtc RTCPeerConnection API 的 createOffer 方法生成 offer 内容。经过一定处理和记录后,触发 'offer' 事件处理函数,处理函数中 Peer 对象调用信令服务器接口发送 offer 消息。竹林源码头
WebRTC 原生 API createOffer 生成的消息。
Peer offer 事件得到的 offer 消息内容。
信令服务器发送的 offer 消息内容。
answer 消息生成,当收到对端 offer 消息后,调用 PeerConnection 的 handleOffer 处理函数,接着主动调用 PeerConnection.answer 方法,该方法调用 _answer 方法,bilibili答题源码该方法调用 webrtc 原生 RTCPeerConnection API createAnswer 方法生成 answer。经过 _answer 记录处理后,触发 answer 事件,此事件调用服务发送 answer 消息。
原文链接:webrtc SDP和candidate消息生成位置学习
WebRTCä¹STUNä¸TURN以åICE
å¨ç°å®Internetç½ç»ç¯å¢ä¸ï¼å¤§å¤æ°è®¡ç®æºä¸»æºé½ä½äºé²ç«å¢æNATä¹åï¼åªæå°é¨å主æºè½å¤ç´æ¥æ¥å ¥Internetãå¾å¤æ¶åï¼æ们å¸æå¤äºä¸åå é¨ç½ç»ä¸ç两å°ä¸»æºè½å¤ç´æ¥è¿è¡éä¿¡ï¼å³æè°çP2Péä¿¡ï¼é¿å éè¿å ¶ä»å ¬å ±æå¡å¨çä¸è½¬çæ¹å¼æ¥éä½å®æ¶éä¿¡ç延è¿ã
ç±äºä¸»æºå¯è½ä½äºé²ç«å¢æNATä¹åï¼å¨è¿è¡P2Péä¿¡ä¹åï¼æ们éè¦è¿è¡æ£æµä»¥ç¡®è®¤å®ä»¬ä¹é´è½å¦è¿è¡P2Pé信以åå¦ä½éä¿¡ã
è¿ç§ææ¯é常称为NATç©¿éï¼NAT Traversalï¼ï¼èæ´å¤å ³äºNATçä»ç»æ们å¨ã WebRTCä¹NATç©¿å¢ ãå·²ç»åäºç®åçä»ç»ã
å¦æ对NATç©¿éè¿ä¸äºè§£çè¯å»ºè®®å æ¸©ä¹ ä¸ä¸ã
èä»å¤©ç主è§æ¯STUNãTURNåICEï¼å®ä»¬æ¯å®ç°NATç©¿éçä¸åææ¯æ¹æ¡ã
STUNï¼é¦å å¨RFCä¸å®ä¹ï¼ä½ä¸ºä¸ä¸ªå®æ´çNATç©¿é解å³æ¹æ¡ï¼è±æå ¨ç§°æ¯Simple Traversal of UDP Through NATsï¼å³ç®åçç¨UDPç©¿éNATã
å¨æ°çRFC修订ä¸æSTUNåè®®å®ä½äºä¸ºç©¿éNATæä¾å·¥å ·ï¼èä¸æ¯ä¸ä¸ªå®æ´ç解å³æ¹æ¡ï¼è±æå ¨ç§°æ¯Session Traversal Utilities for NATï¼
å³NATä¼è¯ç©¿éãSTUNå¨RFCä¸RFCä¸é¤äºå称ååå¤ï¼æ大çåºå«æ¯å¨æ°çå®ä¹ä¸æ¯æTCPç©¿éã
STUNæ¯å ¸åç客æ·ç«¯/æå¡å¨æ¨¡å¼ï¼å®¢æ·ç«¯å起请æ±ï¼æå¡ç«¯è¿è¡ååºï¼é»è®¤ç«¯å£æ¯ã
两ç§STUNè§èï¼åå«æ¯ RFC å RFC ã
RFCéè¿UDPè¿è¡ç©¿å¢ãç®åçæå¡å¨å¯¹äºUDPçéå¶æ¯è¾å¤ï¼å¯¼è´è¿ç§æ¨¡å¼ç©¿å¢çæåçä¸é«ã
RFCæ¯å¨RFCçå级çï¼ä½æ¯å«ä¹ç¡®æ¯ä¸ä¸æ ·çï¼ä¸ç³»åçç©¿å¢æ»å»ï¼çº³å ¥äºTCPç©¿å¢ã
ææçSTUNæ¶æ¯é½å å«ä¸ªåè(æ¯ä¸ªåèå 8ä½ï¼æ»å ±æ¯ä½)çæ¶æ¯å¤´ï¼å ¶ä¸2个åèï¼ä¹å°±æ¯ä½ï¼çæ¶æ¯ç±»åï¼
2个åèçæ¶æ¯é¿åº¦ï¼è¿ä¸ªé¿åº¦ä¸å å«æ¶æ¯å¤´çé¿åº¦è¿æ个åèçäºå¡IDï¼è¯·æ±ä¸ååºäºå¡IDç¸åã
æ¶æ¯å¤´ä¹åå°±æ¯æ¯æ¶æ¯ä½ï¼æ¶æ¯ä½å¯ä»¥æ¯0æå¤ä¸ªå±æ§ï¼æ¯ä¸ªå±æ§è¿è¡TLVç¼ç ï¼å æ¬ä½çå±æ§ç±»åãä½çå±æ§é¿åº¦ååé¿å±æ§å¼ã
æ´å å ·ä½çæ¶æ¯äº¤äºåè®®ç¬è ç®åè¿ä¸æç®æ·±å ¥ç 究ï¼å 为ç®åæçç®çæ¯ä¸ºäºå¦ä¹ 并使ç¨WebRTCï¼è¿æ²¡å°è¾¾å¼æ¸ æ¥WebRTCçæ¯ä¸ä¸ªç»èç¹çé«æ·±å¢çã
åç§ä¸»è¦NATç±»åä¸æä¸ç§æ¯å¯ä»¥ä½¿ç¨STUNè¿è¡ç©¿éï¼å®å ¨åé¥åNATãåéåé¥åNATå端å£åéåé¥åNATï¼å¯¹ç§°åNATåä¸è½ä½¿ç¨ã
ä¸é¢è¯´å°å¯¹ç§°åNATæ æ³ä½¿ç¨STUNæåè¿è¡ç©¿éï¼è¿æ¶åå°±éè¦TURNåºåºäºã
TURNåè®®çç®çå°±æ¯ä¸ºäºè§£å³å¯¹ç§°åNATæ æ³ç©¿è¶çé®é¢ã
TURNï¼Traversal Using Relay NATï¼éè¿Relayæ¹å¼ç©¿è¶NATï¼ï¼æ¯ä¸ç§æ°æ®ä¼ è¾åè®®ãå 许éè¿TCPæUDPæ¹å¼ç©¿éNATã
TURNä¹æ¯ä¸ä¸ªClient/Serveråè®®ï¼ä¹åSTUN使ç¨åæ ·çæ¶æ¯æ ¼å¼ã
ä½å®ç°TURN clientçç»ç«¯å¿ é¡»å¨é讯å¼å§åä¸TURN serverè¿è¡äº¤äºï¼å¹¶è¦æ±TURN server产ç"relay port"ï¼ä¹å°±æ¯ä¸ç»§è½¬åå°åã
è¿æ¶TURN serverä¼å»ºç«peerï¼å³è¿ç«¯ç«¯ç¹ï¼remote endpointsï¼ï¼å¼å§è¿è¡ä¸ç»§ï¼relayï¼çå¨ä½ï¼TURN clientå©ç¨relay portå°æ°æ®ä¼ éè³peerï¼åç±peerè½¬ä¼ å°å¦ä¸æ¹çTURN clientã
说ç½äºç¬è è§å¾TURNåè®®æ´åä¸ä¸ªä¸ç»§è½¬ååè®®ï¼å¹¶ä¸æ¯çæ£æä¹ä¸çP2Péä¿¡ï¼ä¸ç¥éç¬è è¿æ ·çç解对ä¸å¯¹)
ICEï¼Interactive Connectivity Establishmentï¼äºå¨å¼è¿æ¥å»ºç«ï¼ãICEå®ä¹äºç©¿è¶æ¹æ³èä¸æ¯åè®®ã
æ¢ç¶æ们NATç©¿éå¯ä»¥ä½¿ç¨STUNä¹å¯ä»¥ä½¿ç¨TURNï¼é£ä¹ä»ä¹æ¶å使ç¨STUNä»ä¹æ¶å使ç¨TURNå¢ï¼è¿å°±æ¯ICEåçäºæ ã
æ´éä¿å°è®²ICEæ´åä¸ä¸ªNATç©¿éç管çè ï¼ä½¿ç¨è åªéè¦åè¯ICEæè¦ç©¿å¢å³å¯ï¼è³äºæä¹ç©¿å¢é£å°±æ¯ICEçäºæ äºã
ICEæ´åäºSTUNä¸TURNãICE使å¾ä¸¤ä¸ªNATåç端ç¹éä¿¡æ´å 便æ·ãICE使ç¨STUNè¿è¡ææ´ï¼è¥å¤±è´¥ï¼å使ç¨TURNè¿è¡ä¸è½¬ã
ä¸é¢è¯´è¯´ICEç主è¦å·¥ä½ï¼
1ãæ¶éåéå°åä¹å°±æ¯æ¶éCandidate
æè°çCandidateå°±æ¯ä¸ä¸ªç±IPå端å£ç»æçå°åãèCandidateåæä¸ç§ç±»åï¼
2ã对Candidate Pairè¿è¡æåº
ICEæ¶éå°äºåéè å°ååï¼ä¸¤ä¸ªå¯¹ç端é½æ¥æäºè¥å¹²èªå·±å对æ¹çåéå°å,并å°å ¶é 对,ç»æCandidate Pairã
æ¯å¯¹Candidate Pairé½æ对åºçä¼å 级ï¼ICEéè¦å¯¹æ¯å¯¹Candidate Pairè¿è¡ä¼å 级çæåºã
3ã对åéå°åè¿è¡è¿éæ§æ£æµ
ICE对æåºå¥½çCandidate Pairè¿è¡åéæ£æµåæ¥æ¶æ£æµï¼åéåæ£æµæ¯åæ¶è¿è¡çï¼å¦æåéæ¶æ¯åºå»ä¹åè¿è½æ¶åååéåºå»ä¸æ ·çä¿¡æ¯å说æè¿éæ§æ¯éç
ãP2Pææ¯è¯¦è§£(å)ï¼P2Pææ¯ä¹STUNãTURNãICE详解ã
å¾®ä¿¡å ¬å·ï¼ææ³è§æ
CentOS7下使用SRS搭建流媒体服务器
本地服务器配置:使用 CentOS7 Linux 系统(版本:3..0-..1.el7.x_),IP 地址为 ...。将服务器角色定位为使用 SRS(Simple Realtime Server)搭建流媒体服务器。SRS 支持 RTMP、微验源码HTTP-FLV、HLS、WebRTC 协议。推流端设备采用 ffmpeg + OBS 软件进行流媒体推送,拉流端则可以使用 VLC 播放器或在网页中嵌入 SRS 自带的播放器。测试场景设计为通过 ffmpeg 测试 RTMP 推流功能,然后分别使用 VLC 和 SRS 播放器进行流媒体拉取。
所需资料与工具:
链接:pan.baidu.com/s/1x5DyST...(提取码:epxx)
参考网站与资源:
GitHub:ossrs/srs(SRS 源码)
SRS 官网:ossrs.net/(SRS 官方网站)
GitHub Wiki:ossrs/srs/wi...(SRS 起步知识与文档)
SRS:如何用 NGINX 搭建 HLS 分发集群(链接:qq.com)(关于使用 NGINX 与 SRS 集成搭建 HLS 分发集群的教程)
下载 ffmpeg 官方地址:ffmpeg.org/download.htm...(官方 ffmpeg 下载页面)
1、准备工作与环境搭建(使用 root 用户执行):
1.1、安装 CentOS 基础依赖环境
1.2、关闭与禁用防火墙(避免重启服务器后自动开启)
1.3、将 ffmpeg、yasm 和 kk.flv 等文件拷贝至 CentOS 主目录下(使用主目录作为存储位置)
1.4、安装 yasm 编译器
1.5、安装 ffmpeg
1.6、修改 /etc/ld.so.conf 文件
1.7、配置环境变量
1.8、检查环境变量配置是否生效
1.9、Windows 下安装 VLC 和 OBS 播放器
2、SRS 流媒体服务搭建:
2.1、获取 SRS 源码:
- 通过官网下载
- 通过 GitHub 使用**软件下载(推荐)
- 在国内码云使用 gitee.com/ossrs/srs 下载(推荐)
2.2、配置与编译 SRS:
2.3、查看 SRS 配置文件与支持的协议配置(参考 SRS 官方 Wiki)
2.4、启动与关闭 SRS 服务
2.5、通过网页控制台查看 SRS 状态
3、流媒体服务测试:
3.1、使用 ffmpeg 进行 RTMP 推流测试(注意替换实际值)
3.2、RTMP、HTTP-FLV、HLS 拉流地址获取与测试(VLC 或网页 SRS 播放器)
3.3、使用 OBS 播放器进行推流测试(文件推流、摄像头推流与更多推流方式)
4、扩展与学习资源:
4.1、Windows 下搭建 nginx-rtmp 流媒体服务器(参考教程)
4.2、深入学习 SRS 相关知识与技巧(访问 GitHub Wiki 或 SRS 官方网站)