Node.JS: FFmpeg管道视频编码没有创建缩略图
Node.JS: FFmpeg piped video encoding no thumbnail created
我想在上传视频到ffmpeg期间管道实时缩略图创建。一切正常,但没有创建thumbnail.jpg,并且ffmpeg标准错误在库版本显示后挂起。
更新:我更新了我的代码,但它也没有创建一个有效的缩略图。
var formidable = require('formidable'),
http = require('http'),
sys = require('sys'),
spawn = require('child_process').spawn;
function spawnFfmpeg(exitCallback) {
var args = ['-i', 'pipe:0', '-c:v', 'mjpeg', '-ss', '00:00:13', '-vframes', '1', '-s', '100x80', 'thumbnail.jpg']
var ffmpeg = spawn('ffmpeg', args);
console.log('Spawning ffmpeg ' + args.join(' '));
ffmpeg.on('exit', exitCallback);
ffmpeg.stderr.on('data', function(data) {
console.log('grep stderr: ' + data);
});
return ffmpeg;
}
http.createServer(function(req, res) {
if (req.url == '/' && req.method.toLowerCase() == 'get') {
// show a file upload form
res.writeHead(200, {'content-type': 'text/html'});
res.end
('<form action="/upload" enctype="multipart/form-data" method="post">'
+ '<input type="text" name="title"><br>'
+ '<input type="file" name="upload" multiple="multiple"><br>'
+ '<input type="submit" value="Upload">'
+ '</form>'
);
} else if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
// parse a file upload
var form = new formidable.IncomingForm();
form.maxFieldsSize = 29 * 1024 * 1024;
// Handle each part of the multi-part post
var ffmpeg = spawnFfmpeg(function(code) {
console.log('child process exited with code ' + code);
res.end();
});
var form = new formidable.IncomingForm();
// Handle each part of the multi-part post
form.onPart = function(part) {
// Handle each data chunk as data streams in
part.addListener('data', function(data) {
ffmpeg.stdout.pipe(res);
res.pipe(ffmpeg.stdin);
// Write each chunk to disk
//savedFile.write(data);
});
};
// Do it
form.parse(req);
return;
}
}).listen(80, "127.0.0.1");
process.on('uncaughtException', function(err) {
});
经过一番研究和几个小时的测试,我找到了正确的解决方案^_^
var formidable = require('formidable'),
http = require('http'),
sys = require('sys'),
spawn = require('child_process').spawn;
function spawnFfmpeg(exitCallback) {
var args = ['-i', 'pipe:0', '-c:v', 'mjpeg', '-ss', '00:00:13', '-vframes', '1', '-s', '100x80', 'thumbnail.jpg']
var ffmpeg = spawn('ffmpeg', args);
console.log('Spawning ffmpeg ' + args.join(' '));
ffmpeg.on('exit', exitCallback);
ffmpeg.stderr.on('data', function(data) {
console.log('grep stderr: ' + data);
});
return ffmpeg;
}
http.createServer(function(req, res) {
if (req.url == '/' && req.method.toLowerCase() == 'get') {
// show a file upload form
res.writeHead(200, {'content-type': 'text/html'});
res.end
('<form action="/upload" enctype="multipart/form-data" method="post">'
+ '<input type="text" name="title"><br>'
+ '<input type="file" name="upload" multiple="multiple"><br>'
+ '<input type="submit" value="Upload">'
+ '</form>'
);
} else if (req.url == '/upload' && req.method.toLowerCase() == 'post') {
// parse a file upload
var form = new formidable.IncomingForm();
form.maxFieldsSize = 29 * 1024 * 1024;
// Handle each part of the multi-part post
var ffmpeg = spawnFfmpeg(function(code) {
console.log('child process exited with code ' + code);
res.end();
});
var form = new formidable.IncomingForm();
// Handle each part of the multi-part post
form.onPart = function(part) {
// Handle each data chunk as data streams in
part.addListener('data', function(data) {
/*
* This only one line was the solution of my problem now all works really fast !! 500mbit like transloadit it does
*/
ffmpeg.stdin.write(data);
});
};
// Do it
form.parse(req);
return;
}
}).listen(80, "127.0.0.1");
process.on('uncaughtException', function(err) {
});
您的代码看起来像是在管道设置之前启动ffmpeg。
以下内容未经过验证,但听起来像是您需要的:
http://nodejs.org/api/child_process.html child_process_child_process_spawn_command_args_options
child_process.spawn()的'stdio'选项是一个数组,其中每个索引对应子进程中的fd。取值为以下任意一种:
'pipe' -在子进程和父进程之间创建一个管道。管道的父端作为child_process对象的ChildProcess.stdio[fd]的属性公开给父端。为fds 0 - 2创建的管道也可以作为ChildProcess使用。ChildProcess stdin。stdout和ChildProcess。分别stderr。
相关文章:
- 上传图片,然后检查最大标准,然后创建缩略图
- 如何使用缩略图和箭头创建图片库
- 如何使用jqueryjplayer的视频url创建缩略图
- 创建可点击的视频缩略图,在上面的同一页面上加载视频
- 创建缩略图并发布两张图像
- 如何使用引导程序在一行中存在 3 个缩略图后创建新行
- 创建不同大小图像的缩略图
- 使用javascript在画布中创建缩略图
- 为文档的每一页创建缩略图
- Rails:如何创建在单击时展开的图像缩略图
- 如何使用ng repeat以缩略图格式创建一行中有n个项目的m个项目的列表
- CKEditor - CKFinder不会在上传图像后自动创建缩略图
- 如何在Asp.net中使用c#创建编辑缩略图功能,就像在facebook中一样(同时上传显示图像)
- 如何从图像创建缩略图
- 需要创建动态缩略图网格
- 如何创建导航选项卡或缩略图作为Firefox或谷歌chrome
- Node.JS: FFmpeg管道视频编码没有创建缩略图
- Jquery -尝试创建一个图像库,在点击缩略图时滑入视图
- 使用Picnicss在Ember中创建缩略图网格
- 尝试使用AJAX创建缩略图库