如何使用节点js通过ffmpeg从上传的视频中提取帧?
How to Extract Frames from the uploaded video through ffmpeg using node js?
我已经创建了用户上传视频的应用程序,我想从该视频中使用 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);`
如果您正在使用 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 参数可让您选择要提取帧的帧间隔。文档中提供了一些其他参数。
愚蠢的错误是“;”,我忘记保留它所以它会无限循环
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);
这是一个代码片段,我可以在视频的 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);
}
我已经创建了用户上传视频的应用程序,我想从该视频中使用 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);`
如果您正在使用 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 参数可让您选择要提取帧的帧间隔。文档中提供了一些其他参数。
愚蠢的错误是“;”,我忘记保留它所以它会无限循环
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);
这是一个代码片段,我可以在视频的 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);
}