2013-05-22 48 views
12

我使用node.js並通過socket.io庫,我收到的數據實際上是jpeg圖像的大塊。這些圖像是從遠程攝像頭捕獲的實時視頻幀。我不得不將視頻以JPEG格式流式傳輸。我正在尋找一種方式來將這些jpeg圖像轉換爲視頻文件(mpeg 4或mjpeg文件)。節點是否有可以做到這一點的庫?我已經看了一下Node-fluent-FFMPEG庫,但只給出了關於將jpeg文件轉換爲視頻的示例,而不是從jpeg圖像流中實時轉換。或者,ffmpeg for windows支持jpeg圖像流作爲輸入嗎?Node.js:從jpeg圖像到視頻文件的實時轉換

+0

我真的沒有答案給你,但我懷疑你將不得不緩衝圖像並將它們編碼成塊 - 大多數編碼算法需要很多幀才能獲得基本的壓縮。 我真的不知道你的用例,所以也許壓縮並不重要。也許webRTC是你的選擇? –

+0

它是否必須是視頻,例如,您不能在畫布上繪製jpeg幀嗎? –

回答

0

使用require("child_process")您可以使用ffmpeg,或者可能有npm模塊來幫助完成此操作。 ffmpeg將允許您首先獲取jpeg列表並將其轉換爲視頻,然後您可以添加一個列表(或僅一個)jpegs到視頻的開頭或結尾。

0

我想你應該看看videofy

var exec = require("child_process").exec; 
var escape = require("shell-escape"); 
var debug = require("debug")("videofy"); 
var mkdirp = require("mkdirp"); 
var uid = require("uid2"); 

/* 
* Expose videofy 
*/ 

module.exports = videofy; 

/** 
* Convert `input` file to `output` video with the given `opts`: 
* 
* - `rate` frame rate [10] 
* - `encoders` the video codec format, default is libx264 
* 
* @param {String} input 
* @param {String} output 
* @return 
* @api public 
*/ 
function videofy(input, output, opts, fn) { 
    if (!input) throw new Error('input filename required'); 
    if (!output) throw new Error('output filename required'); 

    var FORMAT = '-%05d'; 

    // options 
    if ('function' == typeof opts) { 
     fn = opts; 
     opts = {}; 
    } else { 
     opts = opts || {}; 
    } 

    opts.rate = opts.rate || 10; 
    opts.codec = opts.codec || 'libx264'; 

    // tmpfile(s) 
    var id = uid(10); 
    var dir = 'tmp/' + id; 
    var tmp = dir + '/tmp' + FORMAT + '.jpg'; 


    function gc(err) { 
     debug('remove %s', dir); 
     exec('rm -fr ' + dir); 
     fn(err); 
    } 

    debug('mkdirp -p %s', dir); 

    mkdirp(dir, function(error) { 
     if (error) return fn(error); 

     // convert gif to tmp jpg 
     var cmd = ['convert', input, tmp]; 
     cmd = escape(cmd); 

     debug('exec %s', cmd); 
     // covert jpg collection to video 
     exec(cmd, function(err) { 

      if (err) return gc(err); 

      var cmd = ['ffmpeg']; 

      cmd.push('-f', 'image2'); 
      cmd.push('-r', String(opts.rate)); 
      cmd.push('-i', tmp); 
      cmd.push('-c:v', String(opts.codec)); 
      cmd.push(output); 

      cmd = escape(cmd); 

      debug("exec %s", cmd); 

      exec(cmd, gc); 
     }); 
    }); 
} 
0

FFMPEG支持流作爲輸入,如docs說明。

您可以將任意數量的輸入添加到Ffmpeg命令。輸入可以是 [...]可讀流

因此,例如它支持使用

ffmpeg().input(fs.createReadStream('/path/to/input3.avi')); 

這產生從該文件在一個'/path/to/input3.avi'Readable stream

我對FFMPEG一無所知,但是您可以從socket.io(消息may be a Buffer已經發送)中提取消息,並用您自己的Readable stream實現。