Node.js и avconv — конвертация видео в реальном времени

Я работаю над демонстрационным приложением для преобразования видео в реальном времени. Видеофайл анализируется с node-multiparty, файлы с part is piped по avconv.stdin, а при обработке с chunk pipes по write stream.

Вот часть исходного кода:

var form = new multiparty.Form(),
    args = ['-i', 'pipe:0', '-f', 'webm', 'pipe:1'],
    avconv = spawn('avconv', args),
    output = fs.createWriteStream(filePath);

form.on('part', function (part) {
  if (part.filename) {
    part.pipe(avconv.stdin);

    part.on('end', function() {
      console.log('===== Video has been uploaded! =====');
      avconv.stdin.end();
    });
  }
});

avconv.stdout.pipe(output);

Меня интересует событие end, прикрепленное к файлу part. Обычно событие должно запускаться, когда часть анализируется, что означает, что она была загружена.

У меня есть тестовый видеофайл (~ 800 КБ) и ноутбук низкого уровня для тестирования. При запуске теста на локальном хосте событие end срабатывает в самом конце процесса преобразования avconv, который длится ~ 15 с.

Видеофайл размером 800 КБ был загружен намного быстрее, но похоже, что поток part все еще не пуст, ожидая обработки данных avconv.

Я прав или тут что-то другое?


person Roman Liutikov    schedule 05.02.2014    source источник


Ответы (1)


Ты абсолютно прав. Поток Readable генерирует событие end только тогда, когда он полностью использован. Посмотрите здесь: http://nodejs.org/api/stream.html#stream_event_end

person Mr_Mig    schedule 06.02.2014