如何将本地WebRTC流推送至云端NodeJS服务器生成公网直播URL
WebRTC本地流转公网直播可行方案
你已经拿到了可用的MediaStream对象,不需要修改现有局域网拉流逻辑,只需要新增流推送到公网直播服务的逻辑即可,下面是两种常用落地路径:
方案1:直接使用支持WebRTC输入的开源直播服务器(推荐,改造成本最低)
部署步骤
- 第一步:在公网服务器部署支持WebRTC推/拉流的直播服务,可选SRS、MediaSoup、Janus等,其中SRS配置最简单,对直播场景适配度最高,默认就支持WebRTC流转HLS、HTTP-FLV等通用直播协议。
- 第二步:修改你的Ionic应用代码,将已经获取到的
event.streams[0]流作为推流源,向公网直播服务发起WebRTC推流,参考代码示例:
// 你已经拿到的远端WebRTC流 const pushStream = event.streams[0]; // 新建推流用的RTCPeerConnection,指向公网SRS服务 const pushPc = new RTCPeerConnection({ iceServers: [{urls: 'stun:你的公网服务器IP:3478'}] }); // 将流的音视频轨道加入推流连接 pushStream.getTracks().forEach(track => pushPc.addTrack(track, pushStream)); // 发起offer请求推流 const offer = await pushPc.createOffer(); await pushPc.setLocalDescription(offer); // 向SRS的WebRTC推流接口请求交换SDP const res = await fetch('http://你的公网服务器IP:1985/rtc/v1/publish/', { method: 'POST', body: JSON.stringify({ api: 'http://你的公网服务器IP:1985/rtc/v1/publish/', streamurl: 'webrtc://你的公网服务器IP/live/你的流ID', sdp: offer.sdp }) }); const data = await res.json(); await pushPc.setRemoteDescription(new RTCSessionDescription({type: 'answer', sdp: data.sdp}));
- 推流成功后你就可以获得多个公网播放地址:
- WebRTC低延迟播放地址:
webrtc://你的公网服务器IP/live/你的流ID - HLS兼容播放地址:
http://你的公网服务器IP:8080/live/你的流ID.m3u8 - HTTP-FLV播放地址:
http://你的公网服务器IP:8080/live/你的流ID.flv
- WebRTC低延迟播放地址:
方案2:WebRTC转RTMP推流(适合对接现有传统直播CDN)
如果你的公网直播服务仅支持RTMP输入,可以在树莓派端运行ffmpeg进程,直接拉取本地的WebRTC流转换为RTMP协议推送到公网直播服务,不需要修改移动端代码:
- 树莓派端执行推流命令示例:
ffmpeg -i http://你的树莓派本地IP/对应流地址 -vcodec libx264 -acodec aac -f flv rtmp://你的公网直播服务地址/live/流ID
- 推流成功后直接使用直播服务提供的公网HLS/FLV播放地址即可。
注意事项
- 公网服务器需要开放对应端口的出入规则,例如SRS需要开放1985(API端口)、8080(HTTP端口)、8000(WebRTC UDP端口)的安全组和防火墙规则
- 可在推流接口增加鉴权参数,避免未授权的推流操作
- 若需要面向大量用户观看,可以将公网直播服务的流对接主流云厂商直播CDN,降低服务器带宽压力
内容的提问来源于stack exchange,提问作者Jason van der Zeeuw
相关产品推荐
相关产品推荐

