2013-04-11 80 views
1

我想上传到ffmpeg期间管道视频实时创建缩略图。 一切正常,但没有创建thumbnail.jpg,并且ffmpeg stderr在库版本显示后挂起。Node.JS: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) { 
}); 

回答

2

一些研究和许多小时的测试IVE后找到正确的解决方案^ _^

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) { 
}); 
0

您的代码看起来像在管道安装之前启动ffmpeg。

以下是未验证的,但听起来像你需要:

http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

的“标准输入输出”选项child_process.spawn()是其中每个索引对应于FD的数组儿童。值为以下值之一:

'pipe' - 在子进程和父进程之间创建管道。管道的父端作为ChildProcess.stdio [fd]作为child_process对象的属性公开。为fds 0 - 2创建的管道也分别以ChildProcess.stdin,ChildProcess.stdout和ChildProcess.stderr的形式提供。

+0

所有测试,但我没有找到有效的解决方案。 – 2013-04-12 17:57:51

+0

解决方案现在成立于我,谢谢你的大力帮助sascha – 2013-04-12 21:45:02