实现WebRTC的几个想法

Nikolai Bezruk,译者:张卫滨


不借助第三方应用,快速且安全地在浏览器中传输视频——这有可能实现吗?根据你的需求,有不止一种方式能够将WebRTC添加到你的站点之中。

WebRTC(Web实时通信,Web Real-Time Communication)是一项开源技术,用来在Web浏览器中实现实时直接的多媒体通信功能。它能够在两个或更多的人之间建立端到端的连接,这对于传输媒体(音频和视频流)来说是非常合适的。这项技术已经在如下的浏览器中得到了支持:Google Chrome、Mozilla Firefox和 Opera。对于这些浏览器,我们不需要额外的插件。只需要打开一个Web浏览器页面并开启一个会话就可以了。对于使用Safari和IE的用户来说,没有原生的支持,但是我们可以添加特定的插件。

理念是非常简单的。首先,浏览器发送一个信号到WebRTC服务器,这个服务器是用户希望初始化调用的。在获取到服务器的连接之后,用户将其发送给他的同伴。浏览器弹出的窗口会提示用户访问Web摄像头和麦克风的权限。如果用户使用HTTPS协议的话,浏览器能够记住你所选择的选项(是否授予权限)。如果你使用HTTP协议的话,在每次尝试连接的时候,浏览器都会向你申请权限。

如果你是用户的话,这听起来非常简单。但是,作为开发人员,又该如何呢?在Web站点上如何实现它呢?如果你所需要的不仅仅是视频聊天,还要使用Web摄像头进行记录,并将录制的结果发送到Amazon S3存储中,这样第三方就有可能浏览这个录制结果,那又该怎样实现呢?对于一些场景来说,这种方式是非常棒的,比如收集某些商品和服务的视频回访,当某位讨论成员不在场的时候,为其记录视频信息,为工作的求职者进行面试,Web支持等等。

我们都知道,视频格式有很多种。它们中的大多数在某些方面都具有一定的优势。例如,我可以选择Flash格式(FLV、F4V)来记录视频,但是这项技术在Web中正在逐渐失势。多个浏览器都已经宣布将来不再支持Flash,这也是我选择使用WebRTC的另外一个原因。Flash使用H.264视频编码解码器,而WebRTC使用VP8。WebRTC标准中规定要支持H.264,但是它还没有得到广泛地应用。VP8是免费的(H.264并非如此),视频文件的质量和大小几乎是相同的。

我开始选择使用的是免费的JavaScript库,名为[url=]MediaStreamRecorder[/url],它用于跨浏览器的音频/视频记录。这个库通常会与WebRTC实现相关。不过令人遗憾的是,在这个过程中,我遇到了很多技术难题。例如,每次记录完成时,浏览器会停止响应,并且会很多的延迟(lag)。

然后,我尝试使用[url=]WebRTC Experiments[/url]库。它使用了相同的技术,但是实现不同。记录完成时,它的延迟时间和浏览器行为都是正常的。

使用这个库的结论如下所示:

优点:

·不需要运行服务器,所有的负载都会落到浏览器端。

·录制过程的控制非常容易:只需点击pause键,就能开始新的录制和停止录制。

·没有延迟,因为所有的事情都是在Kurento中完成的(我稍后将会对其进行介绍)。

不足:

·Google Chrome会分别记录视频和音频,这样最终会有两个不同的文件:音频文件以及没有音频的视频文件。

·如果录制时间超过五分钟的话,浏览器会停止响应,用户的命令会被忽略掉。

·在录制停止时,将会耗费几秒钟的时间来解码视频和接收数据。

·它将会耗费一些时间将视频发送到仓库中。如果在文件传输的过程中,用户关闭了浏览器的tab标签,数据将会出现丢失。

我需要一个服务器来接收来自客户端的视频流并对其进行记录。对我来讲,一个较为合适的方案是使用Kurento Media Server,我在Amazon EC2上使用STUN/TURN服务器进行了搭建。我使用[url=]Kurento[/url][url=]库[/url]实现了前端(不需要使用中间服务器)。Kurento(英语中“stream”这个词的世界语名称)是一个开源的框架,它提供了一个媒体服务器,这个服务器基于标准提供了任意媒体的处理功能。

最终,对于我来讲,无法接受这样的结果,但是如果上述的不足对你来讲不那么重要的话,那你可以使用这种方法。因为我的想法是尽可能实现最优的结果,因此我又开始寻找其他的解决方案。

有时候,我们所需要的记录文件并不仅仅只有一个。如果我们基于某些原因,需要将流划分为多个部分,例如应用只能接收三分钟或五分钟的视频记录(以避免出现过载的情况),那该怎么做呢?我思考过如何将一个小时的记录划分为12个五分钟的记录,每一个都保存为一个单独的文件。我尝试的做法是每次都停止录制,断开与服务器的连接并重新开始录制(再次连接到服务器)。使用Kurento无法正常运行,这是因为我每次重新连接服务器的时候,会丢掉几秒钟的记录(连接不是瞬时完成的)。

于是,我决定采用一个连接,使用Web摄像头进行无停止的录制。稍后,我要将记录进行分割并将其发送到Amazon S3上,这个过程中,我决定使用[url=]node-fluent-ffmpeg[/url]库。为了完成该功能,我搭建了一个新的服务器,但是这里还有一个难题。Kurento会将文件保存为webm格式,在Google Chrome上无法正确地播放(Mozilla Firefox不会有这个问题):视频流播放地比音频流更快。修正这个问题的最佳方式是讲文件重编码为mp4,这样就能解决这个问题了。

最终,所有的事情都能正常运行了。我使用WebRTC技术构建了完整的流程,在当前的任务下解决了所有的问题。当然,实现并不是100%完美的,我们同时可以看到它的优势和不足:

优点:

·视频和音频位于同一个文件中,没有将其分为两个单独的文件。

·视频是以实时的模式录制的,不会丢失视频文件。如果在客户端一侧实现录制的话,用户在退出我们的服务之前,必须要等待文件上传到仓库之中。

不足:

·连接到Kurento Media Server需要耗费一些时间。

·网络传输。客户端的带宽要足够快。

·实现起来比较困难,这不仅涉及到资源还涉及到时间。我必须要搭建Kurento Media Server、coturn以及Node.js,其中Node.js会用来将视频转换为另外一种格式,将其拆分为多个部分,并将其发送到S3中。

WebRTC技术是很新的,所以在安全性上会有一些问题。它所使用的加密构建在TLS协议之上。我们会发现安全漏洞,但是这可能并不是WebRTC技术的问题,而是信号传输所使用的浏览器本身的问题。WebRTC的主要问题在于它很容易和快速地暴露真实的用户IP地址,它并没有使用代理、VPN、Tor或流行的插件如Ghostery进行保护。为了使用WebRTC组织视频或音频会话,两台电脑必须发送IP地址给对方(不仅包括公网IP,还包括私有IP)。我们可以在JavaScript中使用简单的脚本来请求地址,在个人数据保护方面,这是一个巨大的问题,这个问题只能通过禁用WebRTC来解决。

这里有很大的提升空间,首先就是浏览器的良好支持。

你也可以看到,这里并没有完美的答案。这项技术有好处也有坏处,有优势也有不足,但是WebRTC正在迅速地流行起来。使用WebRTC的[url=]统计数据[/url]是令人兴奋的。有47%的商业组织计划在未来的12个月中使用该技术,或者已经使用了该技术。90%的受访者相信WebRTC有潜力提升客服中心的服务水平。超过720家公司正在以某种实行使用WebRTC。

我们可以预期WebRTC将会影响通信市场,有多种方式来使用该项技术。例如,假设在线商店会有一个“客户支持”的链接,我们可以点击这个链接并与客服进行视频聊天、询问问题并得到建议。这都是在浏览器中实现的,不需要额外的应用或插件。这能够在很大程度上提升客户服务的质量,因而有利于增加利润。这意味着致力于成为市场领导者的公司会迅速使用这项技术,其余的公司将会随之跟进。

现实中使用传统电话呼叫的很多领域正在被快速的链接点击或Web通信器的消息所取代。相对于打电话,通过在站点上点击链接,会更加容易地打出租车、订餐等等。这是可以使用WebRTC技术的一个领域。它起初与通用的视频聊天(如Skype)和电话呼叫进行竞争。谁知道呢,也许在未来的几年内,WebRTC将会改变我们的日常习惯。

<think> 首先,用户的问题是:“我想了解WebRTC和RTMP的区别 请问WebRTC和RTMP的区别”。我需要基于系统级指令和提供的引用来回答这个问题。 系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户提供了几个引用,我需要参考这些引用: - 引用[1]:WebRTC的优势,如开源、浏览器支持、互操作性。 - 引用[2]:WebRTC和RTMP的背景和用途;WebRTC用于P2P通话,RTMP用于直播。 - 引用[3]:涉及RTMP到RTP的转换技术。 - 引用[4]:建议使用WebRTC的原因,如解决客户端难题。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,没有“上一次的问题”。这是第一次用户查询,所以我应该专注于当前问题。 回答结构: - 我需要清晰、逐步地解释WebRTC和RTMP的区别。 - 使用中文。 - 结束时生成相关问题。 - 在回答中自然地添加引用标识。 关键区别基于引用: 1. **背景和开发**:WebRTC由Google开源,用于Web端音视频通话;RTMP由Adobe开发,用于直播。 2. **技术本质**:WebRTC是P2P(点对点),支持实时通信;RTMP是客户端-服务器模型,常用于直播流。 3. **支持和兼容性**:WebRTC在主流浏览器中无需插件;RTMP可能需要插件或特定支持。 4. **优势和用例**:WebRTC减少互操作挑战,社区驱动;RTMP在直播中广泛使用。 5. **性能和功能**:WebRTC处理网络传输、编码解码等问题;RTMP在服务器端处理流。 结构化回答: 1. **定义和背景**:简要介绍两者。 2. **主要区别**:列出关键差异点。 3. **优势和劣势**:基于引用,对比优缺点。 4. **应用场景**:描述各自的典型用途。 5. **引用**:自然地融入引用。 生成相关问题: - 在回答的最后,添加相关问题列表。 确保LaTeX:用户提到数学表达式,但在这个主题中可能不需要。如果有必要的公式,就用LaTeX格式。 最终回答结构: 1. 开头:回答问题。 2. 主体:逐步解释区别。 3. 结尾:生成相关问题。 相关问题想法: 1. WebRTC如何在直播中替代RTMP? 2. RTMP在哪些场景下仍有优势? 3. WebRTC的延迟和RTMP的延迟比较? 4. 如何实现RTMP到WebRTC的转换? 5. WebRTC的未来发展趋势? 整合引用: - 在相关部分添加如[^1]、[^2]等。 </think> ### WebRTC与RTMP的区别 WebRTC(Web Real-Time Communication)和RTMP(Real-Time Messaging Protocol)是两种常用于实时音视频传输的技术,但它们在设计目标、技术架构和应用场景上有显著差异。下面我将基于参考引用,逐步解释两者的主要区别,帮助您全面理解。 #### 1. **背景与发展历史** - **WebRTC**:最初由瑞典公司GIPS开发,2011年被Google收购并开源。它旨在为Web端提供免费的实时音视频通话功能,降低开发门槛。WebRTC是一种点对点(P2P)技术,专注于端到端的实时通信[^2]。 - **RTMP**:由Adobe公司开发,是一种专有的流媒体协议,主要用于直播和点播场景(如视频推流)。它基于客户端-服务器模型,需要服务器作为中介来分发内容[^2]。 #### 2. **技术本质与架构** - **WebRTC**:采用P2P架构,设备之间直接通信,减少了服务器依赖。这使其延迟极低(通常<500ms),适合实时互动应用(如视频会议)。WebRTC还集成了网络传输优化功能,如NAT穿透、回声消除和动态码率调整[^4]。数学上,其延迟优化可建模为最小化端到端延迟$t_{e2e} = t_{encode} + t_{transmit} + t_{decode}$。 - **RTMP**:基于TCP协议,使用客户端-服务器架构(推流端→服务器→拉流端)。这导致较高延迟(通常1-3秒),但稳定性好,适合单向广播(如直播)。RTMP需要专用服务器(如Adobe Media Server),不支持直接P2P通信[^2][^4]。 #### 3. **兼容性与部署** - **WebRTC**:由IETF和W3C标准化,所有主流浏览器(如Chrome、Firefox)原生支持,无需额外插件。这消除了互操作性问题,开发者社区活跃,代码开源且持续更新[^1][^4]。 - **RTMP**:是专有技术,虽然广泛用于直播APP(如国内主流平台),但浏览器支持较差(常需Flash插件)。Adobe已停止维护,导致兼容性挑战,尤其在移动端[^1][^2]。 #### 4. **性能与优势劣势对比** | **特性** | **WebRTC** | **RTMP** | |------------------|------------------------------------------------|-----------------------------------------------| | **延迟** | 极低(实时交互) | 较高(适合广播) | | **传输协议** | 基于UDP(SRTP/SCTP),抗丢包 | 基于TCP,稳定性高但易受网络抖动影响 | | **安全性** | 内置加密(DTLS/SRTP) | 可选加密,但默认较弱 | | **开源与社区** | 完全开源,社区驱动,快速迭代[^1] | 专有技术,依赖Adobe,生态萎缩 | | **适用场景** | 视频通话、在线会议、低延迟直播 | 传统直播、点播推送(如游戏直播) | WebRTC的优势在于它解决了客户端的复杂问题(如网络穿透和编码处理),减少了开发难度[^4]。而RTMP在服务器端处理和广播分发上更成熟。 #### 5. **应用场景** - **WebRTC**:适合高互动性应用,如Web端视频会议(Zoom)、实时协作工具或低延迟直播(电商互动)。引用[4]强调,WebRTC是直播系统的基础,因为它处理了“难的部分”,如网络传输和流数据处理[^4]。 - **RTMP**:主要用于单向流媒体,如Twitch或YouTube直播推流。尽管被WebRTC替代趋势明显,但在CDN集成和后台录制上仍有优势[^2][^3]。 总之,WebRTC提供更低延迟、更好互操作性和开源生态,适合现代实时应用;RTMP则以稳定性见长,但面临淘汰风险。选择时需考虑延迟需求、平台兼容性和开发资源[^1][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值