Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在mp4中从客户端向节点服务器上载和保存流_Javascript_Node.js_Stream_Video Streaming - Fatal编程技术网

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