这更像是一个概念问题,而不是直接的“如何做到这一点”。
通常是否可以实现类似 Flash 的解决方案来在 HTML5 和 nodeJS/binaryJS 中流式传输音频(独立于我们从哪里获取流数据,例如 webRTC 或其他)。如果是这样,你会怎么做?
从 2010 年开始,只有一个关于 stackoverflow 的查询。从那时起, NodeJS和 HTML5 已经成长和成熟。
人们通常做什么:当使用多媒体流(即视频或音频)到服务器时,在getUserMedia() 完全到达之前,在当前时间点肯定没有什么能比 Flash 更好——老实说,这可能需要一段时间才能达到99 % 的浏览器用户将完全使用它。
将数据流式传输到服务器的一般做法是使用客户端 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 跟进和一般用户交互
- 更容易实现到服务器框架中
更新: 我与 Malcontenti-Wilson 先生交谈过,他负责编写的唯一一个 node-rtmp 包,但 8 个月前由于它写得不好而且他遇到了障碍而停产。有人使用过这个或能够检查代码吗?
更新 2: Malcontenti-Wilson 先生只是给我发了一封邮件,让我注意到node-mtrude(有点奇怪的名字),它正在做我们可能想要的事情。有没有人使用这种包?