webRTC直播为什么比RTMP快?

文章对比了Nginx-RTMP和webRTC在视频传输中的延迟表现。Nginx-RTMP由于基于TCP的可靠传输,存在1.7秒延迟且在后台运行时延迟累积严重。而webRTC利用UDP协议,结合ICE技术通过STUN和TURN实现P2P连接,延迟约300ms,即使在后台也无明显增加。webRTC的低延迟得益于直接获取MediaStream对象和JS解码API,不受浏览器后台状态影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Nginx-RTMP存在的问题

  1. 首先是延迟较高,大约是1.7秒,在扭转摄像头后观察画面,有非常明显的滞后感。
    请添加图片描述

  2. 当页面处于后台时,浏览器分配的解码算力有所下降,延迟会有累加情况。

    相比于刚才17:09时的1.7秒延迟,此时延迟已经累积到1分钟以上:

请添加图片描述

SRS-webRTC的效果

  • 延迟在300ms左右,几乎感受不到延迟。扭动摄像头,画面几乎是同时移动的。
    请添加图片描述

  • 不存在累加延迟的问题,即使处于后台,延迟也没有增加,依然是300ms左右
    请添加图片描述

RTMP和webRTC导致速度差别的原因

  1. RTMP是基于TCP的可靠传输,webRTC采用UDP协议传输,建立P2P连接
    1. webRTC针对丢包问题通常采用补偿策略:帧间预测
  2. RTMP建立连接时不包括视频信息,所以还需要对视频数据进行解析;webRTC建立SDP连接时包含视频信息,所以不需要再额外进行解析;
  3. RTMP流使用了浏览器内置解码器,在浏览器处于后台时,性能会下降,导致累积延时特比大,webRTC使用的是JS的两个API,不会因为处于后台而性能降低。
  4. webRTC使用ICE技术通过STUN和TURN寻找最佳通讯路径,建立P2P连接减少受阻塞影响;同时检测网络环境动态选择最优链路。

RTMP和webRTC协议被浏览器接收到播放的过程

  1. RTMP传输flv流在浏览器播放的过程:
    1. 获取RTMP数据转换成flv
    2. flv.js解析:二进制流-> JS对象(音视频流依然是二进制) -> 获取头部标签等信息 -> 音频、视频部分
    3. 解码:利用浏览器内部音视频解码器,二进制流存储在buffer中,将压缩的数据解读成RGBA、YUV格式,转存到浏览器video API中
    4. 播放:渲染画面,播放
  2. webRTC传输flv流在浏览器播放的过程:
    1. SDP Offer/Answer:交换信令,建立连接。双方的SDP中包含希望得到视频的信息和传输视频的信息,以此建立信道
    2. 获取MediaStream对象:不需要解析,直接通过WebRTC API获取,包含了音视频二进制流。
    3. 利用Web Audio API和HTML5 Video API两个JS API去解码和渲染,没有使用浏览器内置解码器。

ICE如何寻找最佳路径

  1. ICE (Interactive Connectivity Establishment)通过STUN(Session Traversal Utilities for NAT)和TURN(Traversal Using Relay NAT)来实现点对点之间的连接。
  2. ICE首先使用STUN协议(Session Traversal Utilities for NAT)来获取本地网络地址,例如NAT类型和公网IP地址等信息,然后将这些信息发送给对方。
  3. 接下来,ICE会在两端同时运行一个ICE代理,通过STUN协议尝试连接对方。如果直接连接不成功,ICE代理就会通过TURN协议(Traversal Using Relays around NAT)连接到TURN服务器。TURN服务器相当于一个中转站,可以让两端之间进行数据传输,避免网络阻塞和NAT等问题的影响。
  4. 当ICE代理连接到TURN服务器时,它会尝试连接对方。如果仍然无法连接,则会使用ICE协议中的候选地址,例如使用UDP和TCP等传输协议,尝试连接对方,直到找到一个可用的路径为止。
  5. 当找到最佳路径时,WebRTC就可以通过该路径进行数据传输。
  6. 如果遇到网络波动,ICE会通过发送心跳包或者其他方式来监测网络的变化,发现网络环境变化时,ICE会尝试重新选择最优的通信路径,以保持连接的稳定性和质量。
### 回答1: 要将树莓派摄像头的RTMP协议转换为WebRTC协议并推流到服务器,可以采取以下步骤: 1. 安装 Janus Gateway Janus Gateway 是一个开源的 WebRTC 服务器,可以将视频流转换为 WebRTC 协议。可以通过以下命令在树莓派上安装 Janus Gateway: ``` sudo apt-get install janus ``` 2. 配置 Janus Gateway 安装完成后,需要对 Janus Gateway 进行一些配置。首先,打开 Janus Gateway 的配置文件 `/etc/janus/janus.cfg`,将以下内容添加到文件末尾: ``` [rtmp-to-webrtc] type = rtmp id = 1 description = RTMP to WebRTC audio = yes video = yes videoport = 5004 videopt = 100 audiport = 5006 audiopt = 111 rtmpUrl = rtmp://localhost/live/test rtmpAudioTrack = 0 rtmpVideoTrack = 1 ``` 这个配置文件指定了将 RTMP 流转换为 WebRTC 流的详细信息。其中,`rtmpUrl` 指定了 RTMP 流的 URL,`videoport` `audioport` 指定了 Janus Gateway 使用的端口号,`videopt` `audiopt` 指定了音视频的负载类型。具体来说,`videopt` 为 100 表示 H.264 编码,`audiopt` 为 111 表示 Opus 编码。 3. 启动 Janus Gateway 启动 Janus Gateway 服务,可以使用以下命令: ``` sudo systemctl start janus ``` 4. 在浏览器中查看视频流 打开浏览器,输入 Janus Gateway 的 URL(默认为 `http://localhost:8088/janus`),进入 Janus Gateway 的界面。在界面中选择 `Streaming`,然后选择 `Play`,填入以下参数: - Type:选择 `WebRTC` - Video room:选择 `1234` - Video codec:选择 `VP8` - Video bitrate:选择 `512000` - Audio codec:选择 `opus` 然后点击 `Start`,就可以在浏览器中观看视频流了。 5. 推流到服务器 最后一步是将视频流推送到服务器。可以使用 WebRTC 的 RTCDataChannel 将视频流传输到服务器。具体实现方法因服务器不同而异,可以参考 WebRTC 相关的文档教程。 以上就是将树莓派摄像头的 RTMP 协议转换为 WebRTC 协议并推流到服务器的步骤。 ### 回答2: 在树莓派中将摄像头的RTMP协议转换为WebRTC协议并推流到服务器的方法如下: 1. 首先,我们需要安装配置WebRTC技术栈。可以使用开源的WebRTC库或框架,例如WebRTC.org提供的WebRTC库。安装配置这些库可能需要一些基础的Linux命令编译技能。 2. 配置树莓派摄像头并连接到树莓派。摄像头可以通过CSI接口或USB连接到树莓派。 3. 编写一个小程序来捕获摄像头的视频流并将其转换为WebRTC协议。这个程序可以使用Python编写,并使用相应的库或框架来实现WebRTC协议。 4. 使用WebRTC技术将视频流推送到服务器。首先,需要通过WebRTC建立一个信令通道来交换媒体数据的SDP(Session Description Protocol)。然后,使用SDP来建立点对点连接,并将视频流通过WebRTC协议推送到服务器。 5. 在服务器端配置一个WebRTC服务器,用于接收来自树莓派的视频流并进行处理。可以使用开源的WebRTC媒体服务器,例如Kurento Media Server或Janus Gateway等。 6. 在WebRTC服务器上配置流媒体服务器,例如NGINX或Wowza,以便将视频流推送到其他设备或应用程序。 总结起来,将摄像头的RTMP协议转换为WebRTC协议并推流到服务器的步骤包括安装配置WebRTC技术栈、配置树莓派摄像头、编写捕获转换视频流的程序、建立WebRTC信令通道、推送视频流到服务器,并在服务器上配置流媒体服务器。 ### 回答3: 在树莓派上,将摄像头的RTMP协议转成WebRTC协议并推流到服务器,可以通过以下步骤实现: 首先,需要安装并配置相应的软件组件。在树莓派上安装FFmpeg来处理视频流,并配置好摄像头。 其次,需要利用WebRTC的技术来进行协议转换。WebRTC是一种支持实时音视频通信的开源协议,需要在树莓派上安装WebRTC相关的库组件。 接下来,通过编写代码脚本来实现协议转换推流。可以使用Python等编程语言来编写代码,调用FFmpegWebRTC相关的命令函数来处理视频流,并将RTMP协议转成WebRTC协议。 在代码中,可以设置树莓派作为WebRTC的发送端,将摄像头捕获的视频流进行编码转换,然后通过WebRTC协议将其推流到服务器。可以使用WebRTC提供的API函数,例如`getUserMedia`函数来捕获摄像头的视频流,`createOffer`函数来生成WebRTC的offer,并通过WebSocket或其他方式将其发送到服务器。 最后,在服务器上也需要相应的配置组件来接收处理WebRTC协议的推流。可以使用WebRTC提供的API库来接收处理树莓派推流过来的视频流,并进行解码显示。 综上所述,需要安装配置FFmpegWebRTC相关的组件,编写代码实现协议转换推流,并在服务器上进行相应的配置处理,才能实现在树莓派中将摄像头的RTMP协议转成WebRTC协议并推流到服务器的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值