Как получить размер файла в nodejs asyn c await? - PullRequest
0 голосов
/ 23 января 2020

Как получить размер файла в nodejs asyn c await?

Вот код для потоковой передачи видео с nodejs. (и мы ищем оптимизированные идеи для выполнения потокового видео для мобильного серверного API)

const express = require("express");
const fs = require("fs");
const path = require("path");
const app = express();

app.get("/video", async (req, res) => {
  const path = "assets/sample.mp4";
  const stat = await fs.stat(path);  // here is the issue 
  const fileSize = stat.size;
  const range = req.headers.range;

  if (range) {
    const parts = range.replace(/bytes=/, "").split("-");
    const start = parseInt(parts[0], 10);
    const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;

    if (start >= fileSize) {
      res
        .status(416)
        .send("Requested range not satisfiable\n" + start + " >= " + fileSize);
      return;
    }

    const chunksize = end - start + 1;
    const file = fs.createReadStream(path, { start, end });
    const head = {
      "Content-Range": `bytes ${start}-${end}/${fileSize}`,
      "Accept-Ranges": "bytes",
      "Content-Length": chunksize,
      "Content-Type": "video/mp4"
    };

    res.writeHead(206, head);
    file.pipe(res);
  } else {
    const head = {
      "Content-Length": fileSize,
      "Content-Type": "video/mp4"
    };
    res.writeHead(200, head);
    fs.createReadStream(path).pipe(res);
  }
});

app.listen(3000, function() {
  console.log("Listening on port 3000!");
});

Этот код имеет проблему с const stat=await fs.stat(path);,

Код синхронизации работает нормально, например const stat=await fs.statSync(path);

как написать fs.stat(); асинхронный? Или есть предложения?

Ответы [ 4 ]

2 голосов
/ 23 января 2020

Что вы можете сделать, это обещать fs.stat, а затем использовать его асинхронно c. Вы можете использовать это. util.promisify()

Чтобы сделать метод обратного вызова, вы можете сделать следующее:

const fs = require("fs");
const writeFile = promisify(fs.writeFile);
const { promisify } = require("util");

async function main() {
    await writeFile("/tmp/test4.js",
        "console.log('Hello world with promisify and async/await!');");

    console.info("file created successfully with promisify and async/await!");
}

main().catch(error => console.error(error));

Вы можете проверить эту ссылку для ссылок.

2 голосов
/ 23 января 2020

Вам нужно использовать promises версию, чтобы использовать async/await. измените ваш запрос на

const fs = require("fs").promises;

По умолчанию используется стиль обратного вызова.

1 голос
/ 23 января 2020

Может быть другой, но поможет вам. Как вы сказали, вы оптимизируете выполнение обработки видео. Таким образом, веб-сайт, как YouTube, использует UDP вместо TCP. Вы можете узнать о UDP Здесь . Если вы используете node js, то вы можете реализовать его с помощью сокетов

io.on('connection', function (socket) {

    console.log('Socket connected: '+socket);   
    io.sockets.emit('msgFromAdmin', 'Hello client, this message sent from admin');
    // call our main handler 
    streamer(socket);

}); 

/*
initializes ffmpeg child process which will listen on udp port:33333 for incoming frames of stream
forward video stream to client.html through socket.io
*/
var streamer = function (socket) {  

    var ffmpeg = require('child_process').spawn("/vagrant/nodejs-ffmpeg-livestreamer/ffmpeg-source/ffmpeg", ["-re","-y","-i", "udp://127.0.0.1:33333", "-f", "mjpeg", "-s","500x500","-pix_fmt","rgb24","pipe:1"]);

    ffmpeg.on('error', function (err) {
        console.log(err);
    });

    ffmpeg.on('close', function (code) {
        console.log('ffmpeg exited with code ' + code);
    });

    ffmpeg.stderr.on('data', function (data) {
        console.log('stderr: ' + data);
    });

    ffmpeg.stdout.on('data', function (data) {

        var frame = new Buffer(data).toString('base64');
        socket.emit('render',frame);
    });

};

Нет времени на написание кода, поэтому этот код был скопирован из Online

Для полного кода вы можете посетить Здесь
0 голосов
/ 23 января 2020

Пожалуйста, используйте npm -multer

проверьте эту ссылку

https://www.npmjs.com/package/multer

var upload = multer ({storage: storage, limit: {fileSize: maxSize}}). single ('bestand');

Как ограничить размер файла при загрузке с помощью multer?

...