【问题标题】:How to Extract Frames from the uploaded video through ffmpeg using node js?如何使用node js通过ffmpeg从上传的视频中提取帧?
【发布时间】:2018-08-14 05:47:38
【问题描述】:

我已经创建了用户上传视频的应用程序,我想在 nodejs 中使用 ffmpeg 从该视频中提取 50 张图像,但是在将其上传到特定文件夹后我无法获取该文件。我正在通过 multer 上传视频,因为它将视频存储在指定文件夹中,之后我使用读取流读取了该视频,但它没有提供有关该特定视频的正确信息

代码:

var express = require('express');

var app = express();

var bodyParser = require('body-parser');

var path = require('path');

var multer = require('multer');

var cfenv = require('cfenv');

var watson = require('watson-developer-cloud');

var ffmpeg = require('ffmpeg');

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({"extended": false}));

app.use(express.static(__dirname + '/public'));

var storage = multer.diskStorage({
    destination: function(req, file, callback){
        callback(null, './public/class'); // set the destination
    },
    filename: function(req, file, callback){
        callback(null, 199212+ '.avi'); // set the file name and extension
    }
});

var upload = multer({storage: storage});
 
 app.upload = upload;
 
 // get the app environment from Cloud Foundry
 var appEnv = cfenv.getAppEnv();

var VisualRecognitionV3 = require('watson-developer-cloud/visual-recognition/v3');

var fs = require('fs');


var visualRecognition = new VisualRecognitionV3({
  version: '2018-03-19',
  iam_apikey: 'aaIFu-fHWBXgj09eVarEQUFlIaTeH9bpgvRqHIJxu_8N'
});


app.post('/imgtable',app.upload.single('video-upl'),function(req,res){
                
    var video_file = fs.createReadStream(req.file.path);
                                    
 try {
    var process = new ffmpeg('./public/class/199212.avi');
    process.then(function (video) {
        // Video metadata
        console.log('******************************');
        console.log(video);
        // FFmpeg configuration
        console.log('*********************************');
        console.log(video.info_configuration);
    }, function (err) {
        console.log('Error: ' + err);
    });
} catch (e) {
    console.log(e.code);
    console.log(e.msg);
}

    
})

app.listen(3000);`

【问题讨论】:

  • 碰到这个。有同样的情况。你找到解决方案了吗?
  • 是的,我会在这里发布解决方案,谢谢

标签: node.js ffmpeg extract frames


【解决方案1】:

如果您使用的是 ffmpeg npm package,您只需稍作调整即可使用 fnExtractFrameToJPG 函数:

try {
        var process = new ffmpeg(file);
        process.then(function (video) {
            video.fnExtractFrameToJPG("this/is/a/directory", {
                every_n_frames : 1
            }, myCallbackFunction())
        }, function (err) {
            console.log('Error: ' + err);
        });
    } catch (e) {
        console.log(e.code);
        console.log(e.msg);
    }

every_n_frames 参数可让您选择要提取帧的帧间隔。文档中提供了一些其他参数。

【讨论】:

    【解决方案2】:

    这是一个代码 sn-p,它可以让我在 1 分 30 秒的视频中提取单个帧。希望对你有帮助:)

    var ffmpeg = require('ffmpeg');
    
    try {
      var process = new ffmpeg('./video.mp4');
      process.then(function (video) {
        video.addCommand('-ss', '00:01:30')
        video.addCommand('-vframes', '1')
        video.save('./test.jpg', function (error, file) {
            if (!error)
              console.log('Video file: ' + file);
          });
      }, function (err) {
        console.log('Error: ' + err);
      });
    } catch (e) {
      console.log(e.code);
      console.log(e.msg);
    }
    

    【讨论】:

      【解决方案3】:

      愚蠢的错误是';',我忘了保留它,所以它会无限循环

      var express = require('express');
      
      var app = express();
      
      var bodyParser = require('body-parser');
      
      var path = require('path');
      
      var multer = require('multer');
      
      var cfenv = require('cfenv');
      
      var watson = require('watson-developer-cloud');
      
      var ffmpeg = require('ffmpeg');
      
      var stat = require('fs').statSync;
      
      var zipFolder = require('zip-folder');
      
      
      app.use(bodyParser.json());
      
      app.use(bodyParser.urlencoded({"extended": false}));
      
      app.use(express.static(__dirname + '/public'));
      
      var storage = multer.diskStorage({
          destination: function(req, file, callback){
              callback(null, './public/class/'); // set the destination
          },
          filename: function(req, file, callback){
              callback(null,'NotUseful.mp4'); // set the file name and extension
          }
      });
      
      var upload = multer({storage: storage});
       
       app.upload = upload;
       
       // get the app environment from Cloud Foundry
       var appEnv = cfenv.getAppEnv();
      
      var VisualRecognitionV3 = require('watson-developer-cloud/visual-recognition/v3');
      
      var fs = require('fs');
      
      
      var visualRecognition = new VisualRecognitionV3({
        version: '2018-03-19',
        iam_apikey: 'aaIFu-fHWBXgj09eVarEQUFlIaTeH9bpgvRqHIJxu_8N'
      });
      
      function tosplit(request)
      {
          var value = request;
          valueArray = value.split("\\");
          return valueArray;
      }
      
      function extsplit(request)
      {
          var value = request;
          nameArray = value.split('.');
          return nameArray;
      }
      
      function makeZip(pathname,zipname){
              
              zipFolder(pathname,zipname, function(err) {
                  
          if(err) {
              console.log('oh no!', err);
              
          } else {
              
              console.log('Zip Created...');
          }
        });
      }
      
      app.post('/upload',app.upload.single('video-upl'),function(req,res){
                      
          var video_file = fs.createReadStream(req.file.path); // Storing File path
          var video_String = JSON.stringify(video_file); // Converting Json into String of req.file.path
          var video_res = JSON.parse(video_String); // Parsing req.file.path  
          
          var valueArray = tosplit(video_res.path);  //Splitting Path in values
          
          var filenme = req.file.originalname; // Requesting Original File name
          var filnameStringify = JSON.stringify(filenme); //Stringify file original name
          var filnameParse = JSON.parse(filnameStringify); //Parsing file Original name
          
          var filename = extsplit(filnameParse);  // Spliting File name from path
          
          var finalpath = './public/class/'+valueArray[2]; // Path to Video for Extracting Images
          
          var destpath = './public/class/'+filename[0]+'/'; //Destinaton Path to Store Images
          
          var zipdest = './public/class/'+filename[0]; //Destination of File to be Zip
          
          var articleid = extsplit(valueArray[2]);  //For ArticleId through Video Name
              
          try {
          var process = new ffmpeg(finalpath);
          process.then(function (video) {
              // Callback mode
              video.fnExtractFrameToJPG(destpath, {
                  frame_rate: 1,
                  number: 50,
                  keep_pixel_aspect_ratio : true,
                  keep_aspect_ratio: true,
                  file_name : filename[0]+'_%s'
              }, function (error,files){
                      
                  if(!error)
                      {   
                          var fileJsonStr = JSON.stringify(files);
                          
                          makeZip(zipdest,'./public/class/'+filename[0]+'.zip');
                          
                          console.log(res);
                          
                          res.send(fileJsonStr).responseJSON;
                      }
              });
          }, function (err) {
               console.log('Error: ' + err);
          });
        }
          
          catch (e) {
          console.log(e.code);
          console.log(e.msg);
      }
      });
      app.listen(3000);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-06
        • 2022-01-03
        • 2017-11-01
        • 2020-05-18
        • 1970-01-01
        相关资源
        最近更新 更多