jos*_*poo 25 javascript live-streaming node.js socket.io webrtc
我一直在研究这个问题但很沮丧,因为我觉得解决方案应该很简单,尽管我知道不会.理想情况下,我只想使用node来托管服务器,webrtc getusermedia来获取本地客户端上的实时流,并使用类似socket.io的内容将流发送到服务器,然后服务器将流广播到远程服务器客户; 好像它是一个简单的消息聊天应用程序.
只是考虑一下这似乎是一种简单的方法,因为实时视频需要连续发送大量数据,这并不等于在事件发送后发送单个消息甚至文件(按下发送按钮) .
也许我错了,但是直播视频流应用程序是否可以遵循node/socket.io messenger app的相同结构?你会发送从getUserMedia返回的媒体对象,blob,一些二进制数据吗(我已经尝试了所有这些,但可能没有正确).
理想的目标是一个应用程序,根据需要使用尽可能少的额外绒毛,安装很少的npm,几乎没有额外的JavaScript库,或者很少担心编码/解码或者ICE或STUN到底是什么.有什么方法可以这样做,还是我要求太多?
理想的客户
var socket = io();
var local = document.getElementById("local_video");
var remote = document.getElementById("remote_video");
// display local video
navigator.mediaDevices.getUserMedia({video: true, audio: true}).then(function(stream) {
local.src = window.URL.createObjectURL(stream);
socket.emit("stream", stream);
}).catch(function(err){console.log(err);});
// displays remote video
socket.on("stream", function(stream){
remote.src = window.URL.createObjectURL(stream);
});
Run Code Online (Sandbox Code Playgroud)
理想服务器
var app = require("express")();
var http = require("http").Server(app);
var fs = require("fs");
var io = require("socket.io")(http);
app.get('/', onRequest);
http.listen(process.env.PORT || 3000, function() {
console.log('server started');
})
//404 response
function send404(response) {
response.writeHead(404, {"Content-Type" : "text/plain"});
response.write("Error 404: Page not found");
response.end();
}
function onRequest(request, response) {
if(request.method == 'GET' && request.url == '/') {
response.writeHead(200, {"Content-Type" : "text/html"});
fs.createReadStream("./index.html").pipe(response);
} else {
send404(response);
}
}
io.on('connection', function(socket) {
console.log("a user connected");
socket.on('stream', function(stream) {
socket.broadcast.emit("stream", stream);
});
socket.on('disconnect', function () {
console.log("user disconnected");
});
});
Run Code Online (Sandbox Code Playgroud)
这是破解的应用程序:https://nodejs-videochat.herokuapp.com/
这是github上破解的代码:https://github.com/joshydotpoo/nodejs-videochat
Gau*_*ary 16
尽量清楚明确.首先,您没有在这里使用WebRTC.getUserMedia()是导航器WebAPI的一部分,您可以使用它从相机获取媒体流.
使用WebRTC意味着您正在使用ICE和STUN/TURN服务器进行信令.您将使用主机服务器(节点)指定ICE配置,识别每个用户并提供相互呼叫的方式.
如果您想通过主机传输它,可能您应该以块的形式流式传输并设置自己的信令基础架构.您可以将Stream API与套接字io一起使用来以块(数据包)的形式传输数据.在这里看到Stream API(socket.io)
另外,您可以在这里查看WebRTC + Socket.io的实例:Socket.io | WebRTC视频聊天
您可以在此处找到更多信息:将媒体流发送到主机服务器
我认为这个主题是关于节点服务器支持直播或视频聊天,它比你想象的要复杂得多,让我举例说明。直播和视频聊天都可以使用WebRTC,但直播不需要使用WebRTC 。两者都需要一些节点服务器来支持信令和流媒体。
如果您想将相机作为直播发布,并转发给数千名玩家,这就是所谓的直播。延迟不是很关键,一般3~10s就可以了。
如果你想互相交谈,用你的摄像头,也转发给其他用户,这就是视频聊天。<400ms一般来说,延迟/滞后非常敏感,必须~200ms。
它们完全不同,我们分开讨论。
直播的关键是跨平台(H5和移动)、流畅无缓冲、快速启动切换流。流拱如下:
Publisher ---> Server/CDN ---> Player
Run Code Online (Sandbox Code Playgroud)
我们来谈谈播放器,HLS(LLHLS)是首要的交付协议,它被广泛使用并且在H5(PC和移动)和移动(iOS和Android)上运行良好。唯一的问题是延迟大约为5~10s,甚至更大。因为它是基于文件的协议。
另一种低延迟(3~5s)的协议也可以,它是HTTP-FLV,所有PC-H5的hls.js都支持,移动端的ijkplayer也支持,一些CDN也支持这个协议。唯一的问题是对mobile-H5不友好。
对于播放器来说,WebRTC也可以播放流,它在PC-H5(如Chrome)上运行良好。问题是移动端,运行 WebRTC 原生播放器非常困难。除了复杂性之外,您还需要一个信令服务器,用于交换 SDP。
对于发布商来说,这很复杂,因为它取决于您的客户:
归根结底,直播经济是基于C/C++的,FFmpeg/WebRTC/SRS是C/C++写的,但是也有一些nodejs的服务器,你可以通过像nodejs rtmp.
延迟是视频聊天最重要的特性,因此您必须为客户端(发布者和播放器)使用 WebRTC。
有不同的视频聊天服务器:
正如我所说,构建一个WebRTC系统是非常复杂的,所以请反复思考你的场景:你真的需要一个WebRTC系统,还是只是需要通过WebRTC发布直播?
如果不确定,请先尝试直播解决方案,它简单且稳定。
| 归档时间: |
|
| 查看次数: |
32193 次 |
| 最近记录: |