Javascript 如何在mp4中从客户端向节点服务器上载和保存流
我正试图找到一种方法将客户端摄像机(Javascript 如何在mp4中从客户端向节点服务器上载和保存流,javascript,node.js,stream,video-streaming,Javascript,Node.js,Stream,Video Streaming,我正试图找到一种方法将客户端摄像机(navigator.getUserMedia)的视频以.mp4的形式流到Node.Js服务器上,但我似乎找不到一种方法将其全部放在一起 如何将视频流块从摄像机上传到服务器并保存在.mp4文件中 提前谢谢大家 浏览器上的本地: let myStreamHandler = function (myStream) { // Send myStream to server }; let myErrorHandler = function (error) {
navigator.getUserMedia
)的视频以.mp4的形式流到Node.Js服务器上,但我似乎找不到一种方法将其全部放在一起
如何将视频流块从摄像机上传到服务器并保存在.mp4文件中
提前谢谢大家
浏览器上的本地:
let myStreamHandler = function (myStream) {
// Send myStream to server
};
let myErrorHandler = function (error) {
alert(error);
};
if (typeof navigator.mediaDevices.getUserMedia === "undefined") {
navigator.getUserMedia({ video: true, audio: true }, myStreamHandler, myErrorHandler);
} else {
navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(myStreamHandler).catch(myErrorHandler);
}
var http = require('http');
var router = require('routes')();
var Busboy = require('busboy');
var port = 5000;
// Define our route for uploading files
router.addRoute('/video_stream', function (req, res, params) {
if (req.method === 'POST') {
// Create an Busyboy instance passing the HTTP Request headers.
var busboy = new Busboy({ headers: req.headers });
// Listen for event when Busboy finds a file to stream.
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
// We are streaming! Handle chunks
file.on('data', function (data) {
// Here we can act on the data chunks streamed and save them as mp4.
});
// Completed streaming the file.
file.on('end', function () {
console.log('Finished with ' + fieldname);
});
});
// Listen for event when Busboy finds a non-file field.
busboy.on('field', function (fieldname, val) {
// Do something with non-file field.
});
// Listen for event when Busboy is finished parsing the form.
busboy.on('finish', function () {
res.statusCode = 200;
res.end();
});
// Pipe the HTTP Request into Busboy.
req.pipe(busboy);
}
});
var server = http.createServer(function (req, res) {
// Check if the HTTP Request URL matches on of our routes.
var match = router.match(req.url);
// We have a match!
if (match) match.fn(req, res, match.params);
});
server.listen(port, function () {
console.log('Listening on port ' + port);
});
在远程节点服务器上:
let myStreamHandler = function (myStream) {
// Send myStream to server
};
let myErrorHandler = function (error) {
alert(error);
};
if (typeof navigator.mediaDevices.getUserMedia === "undefined") {
navigator.getUserMedia({ video: true, audio: true }, myStreamHandler, myErrorHandler);
} else {
navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(myStreamHandler).catch(myErrorHandler);
}
var http = require('http');
var router = require('routes')();
var Busboy = require('busboy');
var port = 5000;
// Define our route for uploading files
router.addRoute('/video_stream', function (req, res, params) {
if (req.method === 'POST') {
// Create an Busyboy instance passing the HTTP Request headers.
var busboy = new Busboy({ headers: req.headers });
// Listen for event when Busboy finds a file to stream.
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
// We are streaming! Handle chunks
file.on('data', function (data) {
// Here we can act on the data chunks streamed and save them as mp4.
});
// Completed streaming the file.
file.on('end', function () {
console.log('Finished with ' + fieldname);
});
});
// Listen for event when Busboy finds a non-file field.
busboy.on('field', function (fieldname, val) {
// Do something with non-file field.
});
// Listen for event when Busboy is finished parsing the form.
busboy.on('finish', function () {
res.statusCode = 200;
res.end();
});
// Pipe the HTTP Request into Busboy.
req.pipe(busboy);
}
});
var server = http.createServer(function (req, res) {
// Check if the HTTP Request URL matches on of our routes.
var match = router.match(req.url);
// We have a match!
if (match) match.fn(req, res, match.params);
});
server.listen(port, function () {
console.log('Listening on port ' + port);
});
我构建了一个节点应用程序,用于拍摄摄像机,并将其发送到节点服务器。密码打开了 在节点服务器上,我使用FFMPEG将视频重新编码为livestream的FLV。然后我使用RTMP通过HLS将其发送到livestream视频。 (如果您好奇,该应用程序将在live at上运行) 您可以修改FFMPEG代码,使其不输出RTMP流,而是输出mp4 请注意,getUserMedia正在使用Webm,因此该命令类似于:
ffmpeg -i input.webm -c copy output.mp4