Node fluent-ffmpeg killing process kills server - Как запустить и остановить рекордер? - PullRequest
1 голос
/ 15 марта 2019

Я использую fluent-ffmpeg в приложении узла. Запись с экрана / камеры в файл 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.

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

1 Ответ

1 голос
/ 15 марта 2019

Я решил проблему путем отслеживания всех сообщений 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).Поэтому причина, по которой видео не экспортируется, - это волшебная причина, связанная с моим ноутбуком, которую я должен выяснить, но важно то, что мой код работает сейчас и устойчив к этой ошибке сейчас.

...