通过 RTMP 的 NodeJS 和 RED 5 媒体服务器

Posted

技术标签:

【中文标题】通过 RTMP 的 NodeJS 和 RED 5 媒体服务器【英文标题】:NodeJS and RED 5 media server via RTMP 【发布时间】:2012-10-14 16:31:51 【问题描述】:

这更像是一个概念性问题,而不是直接的“如何做到这一点”。

通常是否有可能实现类似 Flash 的解决方案来在 html5 和 nodeJS/binaryJS 中流式传输音频(与我们从哪里获取流数据,例如 webRTC 或其他)无关。如果是这样,你会怎么做?

*** found here 及其自 2010 年以来只有一次查询。从那时起,NodeJS 和 HTML5 已经发展成熟。

人们通常会做什么: 当使用多媒体流(即视频或音频)到服务器时,在getUserMedia() 完全到来之前,在当前时间点肯定没有什么能比 Flash 更好 - 老实说,在 99% 的浏览器用户之前可能take a while完全可以使用它。

将数据流式传输到服务器的一般做法是使用客户端 Flash 或 Flex 应用程序,然后连接到支持 RTMP 协议的媒体服务器,如RED5、FMS 或 Wowza。例如,通过 RTMP 发送麦克风输入的客户端应用程序可能看起来像(简化版)

import flash.net.NetStream;

private var myMic:Microphone;
private var nc:NetConnection;
private var ns:NetStream

nc = new NetConnection();    
ns = new NetStream(nc);
nc.connect(rtmp://localhost/serverApp);
myMic = Microphone.getMicrophone();
ns.attachAudio(myMic);

与服务器应用程序一起,可以轻松地将数据流式传输到服务器。

我想做的事: 让应用服务器在nodeJS(可能实现socketIO 和binaryJS)上运行,以捕获传入的RTMP 流。类似的东西

//require
var rtmp = require('node-rtmp'),
var fs = require('fs');

//rtmp server address
var rtmpServer = 'rtmp://localhost';

//create a binary server listening that receives stream data
var RTMPServer = rtmp.RTMPServer();
var server = RTMPServer (port: 1935);

server.on('connection', function(client)
 //check if user is allowed to do so
 rtmp.newStream(client.stream);
);

可能最好使用 socketIO 来区分通过 eventEmitters 进行的用户交互。

可能有什么优势:一般来说,采用这种方法似乎有点开销,但对我来说可能有优势,我也希望您对此发表评论。

通过运行(例如)轻松验证用户交互express 和 socketIO flash 的混合实现(通过 RTMP)和 getUserMedia()(通过添加 binaryJS 和 Mozilla AudioAPI 的二进制传输机制) 如果完全支持 getUserMedia(),则可以轻松删除 flash 实现 更好地控制 rtmp 跟进和一般用户交互 更容易在服务器框架中实现

更新: 我已经与负责编写 only node-rtmp package 的 Malcontenti-Wilson 先生进行了交谈,该 only node-rtmp package 已在 8 个月前停止,因为它写得不好并且遇到了障碍。有人用过这个或者能查到代码吗?

更新 2: Malcontenti-Wilson 先生只是给我发了一封邮件,让我注意node-mtrude(有点奇怪的名字),它正在做我们可能想要的事情。有人用过这种包吗?

【问题讨论】:

很好的问题。对的,这是可能的。那里有几个 RTMP Node.js 项目。我没有亲自使用过,所以我无法提供好的建议。 我建议您为 rtmpDump (rtmpdump.mplayerhq.hu) 库编写 C 扩展绑定,如此处所述cloudkick.com/blog/2010/aug/23/writing-nodejs-native-extensions 我对node.js一无所知,但bigbluebutton在flash中实现了类似的东西,他们正在开发一个html 5解决方案。可能值得检查一下代码。 【参考方案1】:

是的,这是可能的,但你有一些问题。

1) Red5 的文档严重不足且漏洞百出。

2) rtmpe/rtmps

3) 性能/可扩展性

4) 1 到 3 是您可以克服的问题,但必须非常深入地了解媒体分发及其所有相关问题。当你完成时,你将成为那里真正了解它的大约 800 人中的一员。你必须走很长的路才能解决意想不到的问题。

【讨论】:

+1 on #1 - Red5 完全没有文档记录/已过时,针对它的问题会持续数月,但他们不断发布从未解决未解决问题的版本。 有据可查,有问题吗?尝试更新版本或购买商业服务器。抱怨而不提供解决方案对任何人都没有帮助。 Red5 有缺陷且无证,至少 2 年前是这样。但我想什么都没有改变,因为它的发展太慢了。我想您需要检查商业解决方案,其中一个非常便宜,一个月大约 50 美元,具有良好的可扩展性可能性(用 erlang 编写,而不是 java 编写)。【参考方案2】:

现在有一个名为vertx 的平台可供使用,可以进行polygot 开发。因此 red5 jar 可以与现有代码一起包含在您的服务器端,并且可以运行 rtmp 流服务器。在客户端,您可以使用 video.js 或 JW 播放器之类的东西来播放流,并获得 Flash 回退策略。客户端发布,我不确定是否有任何基于 javascript 的 RTMP 实现可用。

【讨论】:

【参考方案3】:

WCS 是 Fl​​ash、WebRTC、SIP、Websockets 和 Wowza 兼容协议的混合实现:RTSP、RTMP。

流转换方案:

【讨论】:

【参考方案4】:

这是一个老问题,但是,我将这个替代方案发布给那些会偶然发现这个问题的人。 Node 媒体服务器 是一个非常好的媒体服务器,我在我的一个 poc 中使用过它,它支持 rtmp https://www.npmjs.com/package/node-media-server

它的 git repo 也挺活泼的,其实在我的 poc 中使用之前我已经做了一些改动。而且代码也写得很好。 https://github.com/illuspas/Node-Media-Server

附言。它与 OBS 的实时流媒体功能相得益彰。

【讨论】:

以上是关于通过 RTMP 的 NodeJS 和 RED 5 媒体服务器的主要内容,如果未能解决你的问题,请参考以下文章

我们可以只通过 RTMP 流式传输 Flash 视频吗?

Docker安装Red5进行rtmp推流

Red5 和安卓。流音频

Red5 媒体服务器:如何让 rtmp 在 Amazon EC2 上运行?

视频转换 rtsp 流 转rtmp流播放(未完)

通过 RTMP/Rails 录制音频