2013-05-22 33 views
12

Tôi đang sử dụng node.js và thông qua thư viện socket.io Tôi nhận được các khối dữ liệu thực sự là hình ảnh jpeg. Những hình ảnh này là khung của video thời gian thực được chụp từ webcam từ xa. Tôi buộc phải phát video dưới dạng khung hình jpeg. Tôi đang tìm kiếm một cách để chuyển đổi trên bay những hình ảnh jpeg trong một tập tin video (mpeg 4 hoặc mjpeg tập tin). Nút có thư viện có thể thực hiện việc này không? Tôi đã xem qua thư viện Node-fluent-FFMPEG nhưng các ví dụ duy nhất được đưa ra là về chuyển đổi tệp jpeg thành video chứ không phải chuyển đổi khi đang phát trực tiếp từ luồng hình ảnh jpeg. Hoặc cách khác, không ffmpeg cho các cửa sổ hỗ trợ một dòng hình ảnh jpeg như đầu vào?Node.js: chuyển đổi thời gian thực từ hình ảnh jpeg sang tệp video

+0

Tôi không thực sự có câu trả lời cho bạn, nhưng tôi nghi ngờ bạn sẽ phải đệm hình ảnh và mã hóa chúng thành nhiều phần - hầu hết các thuật toán mã hóa yêu cầu nhiều khung hình theo thứ tự để có được nén cơ bản. Tôi thực sự không biết trường hợp sử dụng của bạn để có thể nén không quan trọng. Có thể webRTC là một lựa chọn cho bạn? –

+0

Nó có phải là một đoạn video, chẳng hạn bạn có thể vẽ các khung hình jpeg trên canvas không? –

Trả lời

0

Sử dụng require("child_process") bạn có thể sử dụng ffmpeg hoặc có thể là các mô-đun npm để trợ giúp việc này. ffmpeg sẽ cho phép bạn đầu tiên lấy danh sách các jpeg và chuyển đổi nó thành video, thứ hai bạn có thể thêm một danh sách (hoặc chỉ một) jpeg vào đầu hoặc cuối video.

0

Tôi nghĩ rằng bạn nên xem xét 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 hỗ trợ suối như đầu vào, như đã nêu trong docs.

Bạn có thể thêm bất kỳ số lượng đầu vào nào vào lệnh Ffmpeg. Một đầu vào có thể được [...] một dòng có thể đọc được

Vì vậy, ví dụ như nó hỗ trợ sử dụng

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

mà tạo ra một Readable stream từ tập tin tại '/path/to/input3.avi'.

Tôi không biết gì về FFMPEG, nhưng bạn có thể kéo tin nhắn của bạn đến từ socket.io (tin nhắn may be a Buffer đã) và gói nó với việc thực hiện của riêng bạn Readable stream.

Các vấn đề liên quan