【发布时间】:2012-10-14 16:31:51
【问题描述】:
这更像是一个概念性问题,而不是直接的“如何做到这一点”。
通常是否有可能实现类似 Flash 的解决方案来在 HTML5 和 nodeJS/binaryJS 中流式传输音频(与我们从哪里获取流数据,例如 webRTC 或其他)无关。如果是这样,你会怎么做?
stackoverflow 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解决方案。可能值得检查一下代码。
标签: node.js audio-streaming red5 rtmp webrtc