Процесс уничтожения Node fluent-ffmpeg убивает сервер — как запустить и остановить рекордер?

Я использую fluent-ffmpeg в приложении node. Запись с экрана/камеры в файл mp4. Хотелось бы, чтобы сервер запросил запуск, а другой запрос на остановку записи (ссылки на веб-интерфейс - тестирование некоторых технологий с целью создания приложения Electron позже).

Заводится нормально, а как остановить не пойму.

Это код для запуска (для работы в MacOS):

recordingProcessVideo = ffmpeg(`${screenID}:none`)
     .inputFormat('avfoundation')
     .native()
     .videoFilters(`crop=${width}:${height}:${x}:${y}`)
     .save(filePath);

Я думал, что это остановит его от документации и чтения по теме:

recordingProcessVideo.kill('SIGINT');

Однако, когда я вызываю эту команду, сервер завершает работу со следующим двусмысленным сообщением:

code ELIFECYCLE
errno 1

Кроме того, созданный видеофайл не откроется, как если бы он был закрыт до завершения. Не могу понять, как из документов и того, что люди написали, для запуска и остановки рекордера нужно сделать процесс, а затем убить его, когда он будет готов. Кто-нибудь знает правильный путь - искал целую вечность, но не мог найти ответов.

Использование Node v10.15.2 и Ffmpeg версии V92718-g092cb17983 на MacOS 10.14.3.

Спасибо за любую помощь.


person Scorpio    schedule 15.03.2019    source источник
comment
Почему вы специально используете сигнал «SIGINT»? Это то же самое поведение без него (по умолчанию «SIGKILL»)?   -  person TGrif    schedule 15.03.2019
comment
@TGrif Да, это должно быть «SIGINT». «SIGKILL» — согласно документации — убьет процесс. «SIGINT» укажет процессу изящно остановиться и завершить свою задачу. Должно быть таким же, как нажатие CTRL-C в терминале, которое выдает «SIGINT». Старый метод передачи q на терминал устарел и вместо него следует использовать SIGINT. Вы также можете передать другие сигналы, которые приостановят задачу и возобновят ее, а не уничтожат.   -  person Scorpio    schedule 15.03.2019
comment
Хорошо знать. Я всегда пробую не очень изящный способ, когда хочу убить процесс... Спасибо за .on(event) напоминание.   -  person TGrif    schedule 15.03.2019


Ответы (1)


Я решил проблему, отследив все сообщения FFMpeg, выпущенные в терминале. По какой-то неизвестной причине моя установка FFMpeg выдает ошибку при завершении видео и неправильно закрывает файл. Это происходит и в терминале, хотя ошибка на самом деле не отображается и заканчивается MP4, который на самом деле работает во всех видеоплеерах — даже в браузере — за исключением Quicktime, который я использовал на этом случай. Чтобы предотвратить сбой моего приложения Node из-за ошибки, мне просто нужно было добавить обработчик ошибок к видеовызову. Действительно, я добавлял обработчик в свой исходный код, но я добавлял его в процесс, а НЕ исходный вызов FFMPeg. Таким образом, работающий код выглядит следующим образом (в этом примере я перехватываю все конечные события и регистрирую их).

recordingProcessVideo = ffmpeg(`${screenID}:none`)
 .inputFormat('avfoundation')
 .videoFilters(`crop=${width}:${height}:${x}:${y}`)
 .native()
 .on('error', error => console.log(`Encoding Error: ${error.message}`))
 .on('exit', () => console.log('Video recorder exited'))
 .on('close',  () => console.log('Video recorder closed'))
 .on('end', () => console.log('Video Transcoding succeeded !'))
 .save(file.video);

У меня на ноутбуке две версии FFMpeg, и обе не работают. Официальная загруженная версия, установленная на моем компьютере (V4.1.1), и пакетная версия Node, которую использует мое приложение, что упростит распространение через Electron, поскольку не будет зависеть от установки FFMpeg на локальном компьютере, на котором запущено приложение ( @ffmpeg-установщик/ffmpeg). Таким образом, причина, по которой видео не экспортируется, связана с каким-то волшебным образом, связанным с моим ноутбуком, который я должен выяснить, но, что важно, мой код теперь работает и устойчив к этому сбою.

person Scorpio    schedule 15.03.2019