WebRTC音视频即时通讯通信【免费下载链接】webrtcPure Go implementation of the WebRTC API项目地址https://gitcode.com/gh_mirrors/we/webrtc点击查看免费下载WHIPWebRTC-HTTP Ingestion Protocol与 WHEPWebRTC-HTTP Egress Protocol是建立在 HTTP 之上的标准化 WebRTC 信令协议它们将Offer 通过 HTTP 上传、服务器返回 Answer这一强 API 契约固定下来从而让 OBS、GStreamer 等专业推流工具可以直接对接 WebRTC 媒体服务器。本文以 Pion WebRTC 仓库中的 whip-whep 示例 为主体完整讲解该示例的部署运行、浏览器/OBS 双端推拉流操作并逐段剖析 main.go 的服务端实现与 index.html 的浏览器端实现帮助读者掌握用纯 Go 构建一套推流—中转—订阅WebRTC 直播链路的完整技术方案。WHIP/WHEP 解决什么问题传统 WebRTC 应用的信令SDP 协商通常由双方自行约定而 WHIP/WHEP 把信令固化为两个 HTTP 端点WHIP推流/上行发布端OBS、GStreamer 或浏览器通过POST把 SDP Offer 上传到/whip服务器返回携带完整 ICE Candidate 的 SDP AnswerWHEP拉流/下行订阅端通过POST把 SDP Offer 上传到/whep服务器在 Answer 中携带媒体轨道信息订阅端即可消费同一份媒体流。正是这种强契约让 OBS、GStreamer 这类原本不原生支持 WebRTC 的工具无需了解信令细节即可完成 WebRTC 推流。在 whip-whep 示例 中WHIP 会话接收的 RTP 包会被转发到 WHEP 会话实现一端推流、多端亚秒级观看甚至可以把 WHEP 流再拉回 OBS 做二次处理。快速运行示例该示例因为需要对外提供静态 HTML 页面index.html所以必须克隆仓库后从示例目录运行git clone https://github.com/pion/webrtc.git cd webrtc/examples/whip-whep go run *.go启动成功后终端会打印Open http://localhost:8080 to access this demo监听端口为8080见 main.go 中的http.ListenAndServe(:8080, nil)。通过浏览器发布打开 http://localhost:8080点击页面上的Publish按钮。浏览器会调用getUserMedia采集摄像头与麦克风生成 Offer 后以application/sdp的 Content-TypePOST到/whip拿到 Answer 即完成协商见 index.html 的doWHIP函数。通过 OBS 发布在 OBS 中配置推流配置项取值Service服务WHIPServer服务器http://localhost:8080/whipBearer Token任意值示例未校验OBS 会把编码后的音视频以 WHIP 协议推送到该端点。由于 WHIP/WHEP 是标准化信令GStreamer 等同样支持 WHIP 的推流工具也可按相同方式接入。订阅观看保持推流进行中再次打开 http://localhost:8080 并点击Subscribe。浏览器会添加recvonly音视频 Transceiver将 OfferPOST到/whep拿到 Answer 后即可在页面视频区看到刚才推送的画面见 index.html 的doWHEP函数。同样OBS、GStreamer 也可以通过 WHEP 把这条流拉回去。服务端源码剖析媒体轨道与 ICE 配置服务端在main()中先创建两条本地轨道作为 WHIP→WHEP 的媒体中转载体main.govideoTrack, err webrtc.NewTrackLocalStaticRTP(webrtc.RTPCodecCapability{ MimeType: webrtc.MimeTypeH264, }, video, pion) audioTrack, err webrtc.NewTrackLocalStaticRTP(webrtc.RTPCodecCapability{ MimeType: webrtc.MimeTypeOpus, }, audio, pion)NewTrackLocalStaticRTP 返回一个已预置编解码、直接接收 RTP 包的本地轨道视频为 H264、音频为 Opus轨道 ID 与流 ID 均为pion。还声明了全局的 PeerConnection 配置使用 Google 公共 STUN 服务器辅助 NAT 穿透main.gopeerConnectionConfiguration webrtc.Configuration{ ICEServers: []webrtc.ICEServer{ {URLs: []string{stun:stun.l.google.com:19302}}, }, }WHIP 推流端点whipHandlerwhipHandler 是整个推流链路的入口处理流程如下CORS 预检响应头允许任意跨域来源、POST方法与Authorization头OPTIONS请求直接返回main.go读取 Offerio.ReadAll(req.Body)取出请求体中的 SDP配置 MediaEngine注册 H264PayloadType 96、时钟 90000Hz与 OpusPayloadType 97、时钟 48000Hz、双声道两种编解码main.go组装拦截器先注册intervalpli.NewReceiverInterceptor()——该拦截器每 3 秒向推流端发送一次 PLI 请求促使编码器生成关键帧使视频可 seek且抗丢包代价是画质与码率开销随后调用RegisterDefaultInterceptors补齐 NACK、RTCP 收发报告、TWCC 发送端等默认拦截器main.go。从 RegisterDefaultInterceptors 的实现 可以看到默认集合依次配置了 NACK 生成/应答、RTCP 收发报告、Simulcast 头扩展、统计拦截器与 TWCC 发送端创建 API 与 PeerConnectionwebrtc.NewAPI(webrtc.WithMediaEngine(...), webrtc.WithInterceptorRegistry(...))以自定义 MediaEngine 与拦截器注册表构造 API 实例再据此创建 PeerConnectionmain.go。注意如果手动管理 MediaEngine就必须为每个 PeerConnection 显式创建 InterceptorRegistry而不能依赖webrtc.NewPeerConnection的默认行为声明收发能力AddTransceiverFromKind为视频和音频各添加一个接收 Transceiver表示允许接收一条视频轨道与一条音频轨道main.go转发媒体在OnTrack回调中启动两个 goroutine——一个持续调用receiver.ReadRTCP()消费推流端的 RTCP读到io.EOF即会话结束另一个持续调用track.ReadRTP()读取 RTP 包并剥离 WHIP 扩展头pkt.Header.Extensions nil; pkt.Header.Extension false后按轨道类型写入videoTrack或audioTrack从而完成向所有 WHEP 订阅者的广播main.go回送 Answer调用writeAnswer通过 HTTP 响应返回携带 ICE Candidate 的 SDP。WHEP 订阅端点whepHandlerwhepHandler 与推流端点的差异集中在两点拦截器仅使用默认集合并额外调用ConfigureTWCCHeaderExtensionSender(media, ir)为音视频轨道注册 Transport-CCsdp.TransportCCURI头扩展并挂载 TWCC 头扩展拦截器main.go目的是在订阅端支持 TWCCTransport-wide Congestion Control时提供带宽估计所需的传输级拥塞控制反馈。从源码看该函数会向 MediaEngine 注册视频、音频两条头扩展并添加twcc.NewHeaderExtensionInterceptor()interceptor.go通过peerConnection.AddTrack(videoTrack/audioTrack)把 WHIP 会话写入的全局轨道绑定到订阅连接并为音视频各启动一个循环读取rtpSender.Read(rtcpBuf)的 goroutine持续消费订阅端回传的 RTCP 包——这一步对 NACK 等反馈机制的生效是必需的main.go。统一的 Answer 生成writeAnswerwriteAnswer 是 WHIP/WHEP 两端共用的核心逻辑体现了该协议的关键约束——只能交换一次信令消息因此必须禁用 Trickle ICEpeerConnection.OnICEConnectionStateChange(func(connectionState webrtc.ICEConnectionState) { if connectionState webrtc.ICEConnectionStateFailed { _ peerConnection.Close() } }) peerConnection.SetRemoteDescription(webrtc.SessionDescription{ Type: webrtc.SDPTypeOffer, SDP: string(offer), }) gatherComplete : webrtc.GatheringCompletePromise(peerConnection) answer, err : peerConnection.CreateAnswer(nil) peerConnection.SetLocalDescription(answer) -gatherComplete // 阻塞直至 ICE 收集完成 res.Header().Add(Location, path) res.WriteHeader(http.StatusCreated) // WHIP/WHEP 要求 201 状态码与 Location 头 fmt.Fprint(res, peerConnection.LocalDescription().SDP)其中GatheringCompletePromise返回一个ICE 收集完成即关闭的 channelgathering_complete_promise.go并处理了 promise 创建晚于收集完成导致永久阻塞的边界情况。-gatherComplete确保 Answer 中已包含全部 ICE Candidate这是单次 HTTP 往返完成协商的前提。注释也明确指出生产环境中应通过OnICECandidate回调流式交换候选以缩短建连时间。协议层面WHIP/WHEP 规范要求响应状态码为201 Created并携带Location头示例分别回填/whip与/whep。浏览器端一次 HTTP POST 完成协商doWHIP 与 doWHEP 展示了浏览器侧的对称实现先createOffer并setLocalDescription随后用fetch把offer.sdp以application/sdp类型POST到对应端点响应体即为 SDP Answer直接setRemoteDescription({ sdp: answer, type: answer })。两处的差异仅在于PublishdoWHIPaddTrack把采集到的音视频轨加入连接方向为发送SubscribedoWHEPaddTransceiver(video/audio, { direction: recvonly })声明只收不发并在ontrack中把收到的流挂到video元素播放。页面还通过oniceconnectionstatechange实时把 ICE 连接状态new/checking/connected 等追加到页面下方便于观察协商与建连过程。生产化与扩展方向示例代码在核心信令流程之外还有几个值得在生产中补强的点均为源码注释与实现明确提及Bearer Token 鉴权index.html发送Authorization: Bearer none但服务端未校验真实部署应在whipHandler/whepHandler中解析并验证该头防止任意客户端占用推流通道RTCP 反馈转发当前方案由intervalpli固定每 3 秒请求一次 PLI源码注释main.go建议真实应用应解析订阅端的 RTCP 包并转发给推流端实现按需关键帧与基于反馈的自适应码率ICE 候选流式交换GatheringCompletePromise会带来更长的启动等待时间其文档注释明确说明生产环境建议改用 Trickle ICE 逐条发送候选媒体消费OnTrack中当前直接把 RTP 转发给 WHEP 订阅者若要落盘录制或转码可在读取 RTP 的分支中加入处理逻辑仓库中的 save-to-disk 示例展示了如何把 RTP 写入 IVF 文件编码协商扩展MediaEngine 目前仅注册 H264 Opus需要支持 VP8/VP9/AV1 时可在两处 handler 中参照相同模式追加注册。至此你已经用 Pion WebRTC 搭建起一条OBS/浏览器推流 → Go 服务中转 → 浏览器/工具亚秒级订阅的完整 WHIP/WHEP 直播链路可以基于此继续扩展鉴权、录制、多订阅与码率自适应等能力。赞分享WebRTC音视频即时通讯通信【免费下载链接】webrtcPure Go implementation of the WebRTC API项目地址https://gitcode.com/gh_mirrors/we/webrtc点击查看免费下载相关推荐ADK-Python 如何用 ServiceRegistry 在 services.py 注册自定义会话服务 URI 方案ADK Python 如何用 ServiceRegistry 在 services.py 注册自定义会话服务 URI 方案 ADK 的 adk web 、 adWebRTC音视频即时通讯通信SRS 一键部署视频直播服务实战OBS 推流、WebRTC 浏览器直播与 SRT 低延迟直播全指南SRS 一键部署视频直播服务实战OBS 推流、WebRTC 浏览器直播与 SRT 低延迟直播全指南 搭建一个真正可用的在线视频直播服务远不止运行一个媒体服务音视频后端直播SRS WebRTC 实战指南WHIP/WHEP 推拉流、Candidate 配置与 SFU 架构详解SRS WebRTC 实战指南WHIP/WHEP 推拉流、Candidate 配置与 SFU 架构详解 导读 WebRTC 是 Google 开源的浏览器实时音视频后端直播上一篇抖音无水印下载终极指南免费批量采集工具完整使用教程下一篇抖音内容采集自动化douyin-downloader 开源工具的技术解析与应用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考