使用WebRTC替代传统的RTMP推拉流方案

1 篇文章 0 订阅
1 篇文章 0 订阅

使用WebRTC替代传统的RTMP推拉流方案

RTMP

RTMP 最初设计用于向 Adobe Flash 播放器传输音频、视频和其他数据,但在2020年Adobe宣布停止对Flash播放器的支持,这是势必对RTMP发展有一定的影响。Adobe也建议直播厂商将现有的Flash内容迁移到新的开放格式中去。


RTMP基于TCP的流媒体传输协议,最大的特点是与 CDN 的强绑定,需要借助 CDN 的负载均衡系统将内容推送到接近用户的边缘节点,目前的 CDN,通常有 3-5 秒的延迟,在浏览图片、短视频等内容时用户感知不明显,对于不需要实时强互动的直播,比如体育赛事网络直播、演唱会网络直播、新闻现场直播,延迟是可以接受的,并不会影响用户体验。而在线视频会议、在线教育、电商直播、远程医疗会诊这些对互动有非常高要求的场景,RTMP+CDN 的模式与这些场景对于低延时、无卡顿的要求有一定差距。这时选择WEBRTC技术才能更好地满足开发者的需求。


WebRTC

WebRTC是一种基于浏览器的实时通信的开源解决方案,由Google,Mozilla 和 Opera等机构支持的项目,使用 UDP 私有协议来进行媒体推流,而不需要创建离散的媒体段;并且它是面向无连接的,没有 TCP 连接断开时的挥手确认连接关闭的机制,基于这两点,WebRTC 能够做到毫秒级的低延迟,远远低于基于 RTMP 协议的 CDN 分发的延迟。而且,它直接通过浏览器就可以完成推流和播放,对于开发者接入来说实在太方便。


UPRTC

如果仅在浏览器端使用,是无法满足直播等音视频应用场景的,幸运的是,我们开发的UPRTC方案解决了这种局限性。UPRTC提供了基于webrtc的IOS,Android推拉流SDK,并兼容所有支持webrtc的浏览器,提供了基于Qt,electron的PC端webrtc跨平台解决方案,完美的覆盖了所有的应用场景。


UPRTC客户端和服务端使用webrtc直接连接,中间没有转发,转码,不存在传统厂商使用HLS进行 “最后一英里” 的交付问题。可替代RTMP应用于传统的网络直播,也可以满足需要实时性,互动行的使用场景,例如主播和观众可以进行音视频连麦互动,实时沟通,延时一般低至 400ms 以内。


UPRTC服务可组成类似于CDN的分布式流媒体分发网络,CDN服务节点是被动拉取内容,UPRTC中的房间会根据当前服务器的负载情况自动向其他服务器复制为镜像房间,新进入房间的客户端会自动加入到负载最小的镜像房间中,房间的复制可能是本机的不同进程,也可以是主机间,也可以跨机房,我们也为开发者提供了手动创建镜像房间的接口,也可以指定客户端连接的镜像房间,已达到更加精准控制流量的目的。


UPRTC为开发者提供极简API,没有音视频相关开发经验的小伙伴也能轻松驾驭,每个平台都提供了对应集成DEMO,下面以Android为例:

UPRTCClient.init(appId,appKey)

UPRTCClient client = new UPRTCClient();
client.joinRoom(serverUrl, roomId, userId);

// 加入房间事件回调
void onRoomJoined(int code) {
  client.openCamera()
  client.openMic()
}

具体参照:
官网
文档中心

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一种使用 WebRTC 和 WebSocket 推RTMP 的示例程: 1. 在客户端使用 WebRTC 获取音视频。 2. 将 WebRTC 获取的音视频通过 WebSocket 传输到服务器。 3. 在服务器上使用 FFmpeg 将接收到的音视频推送到 RTMP 服务器。 下面是示例代码: 客户端代码(使用 WebRTC 获取音视频并通过 WebSocket 传输): ```javascript // 获取本地音视频 navigator.mediaDevices.getUserMedia({ audio: true, video: true }) .then(stream => { // 连接 WebSocket 服务器 const socket = new WebSocket('ws://localhost:8080'); // 发送音视频到 WebSocket 服务器 const mediaRecorder = new MediaRecorder(stream); mediaRecorder.ondataavailable = event => { if (event.data && event.data.size > 0) { socket.send(event.data); } }; mediaRecorder.start(1000); }) .catch(error => { console.error(error); }); ``` 服务端代码(使用 Node.js 和 FFmpeg 推RTMP 服务器): ```javascript const WebSocket = require('ws'); const childProcess = require('child_process'); // 连接 WebSocket 服务器 const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', ws => { console.log('WebSocket connected'); // 使用 FFmpeg 推RTMP 服务器 const ffmpeg = childProcess.spawn('ffmpeg', [ '-f', 'webm', '-i', 'pipe:0', '-c:a', 'aac', '-b:a', '64k', '-c:v', 'libx264', '-b:v', '1000k', '-preset', 'ultrafast', '-f', 'flv', 'rtmp://localhost/live/stream' ]); ffmpeg.on('close', (code, signal) => { console.log(`FFmpeg process closed with code ${code} and signal ${signal}`); }); ffmpeg.stdout.on('data', data => { console.log(`FFmpeg stdout: ${data}`); }); ffmpeg.stderr.on('data', data => { console.error(`FFmpeg stderr: ${data}`); }); // 接收从 WebSocket 服务器传输过来的音视频,并将其写入 FFmpeg 的 stdin 中 ws.on('message', message => { ffmpeg.stdin.write(message); }); }); ``` 这是一个简单的示例,实际应用中需要考虑更多的方面,例如优化音视频编码参数、处理网络异常等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值