Мне нужно записать веб-страницу и автоматически сохранить ее как видео, без участия человека.
Я создаю приложение NodeJS, которое генерирует видео MP4 по запросу пользователя. Пользователь предоставляет файл MP3, приложение генерирует анимированные сигналы для звукового файла поверх иллюстрации.
До сих пор я придумал систему, которая открывает сгенерированную веб-страницу в бэкэнде, воспроизводит аудиофайл и показывает аудио-визуализацию для аудиофайла на элементе HTML canvas. Поверх другого холста, в основном с stati c компонентами, например изображениями, которые не анимируются. Система записывает это, на выходе будет видео файл. Наконец, я объединю видеофайл со звуковым файлом, чтобы создать окончательный файл для пользователя.
Я предложил 2 возможных решения, но у них обоих есть проблемы, которые я пока не могу решить. .
Решение # 1
Используйте API-интерфейс безголового браузера, такой как Phantom js или Puppeteer, чтобы снимать снимок экрана x раз в секунду и передавать его в FFmpeg.
Проблема
Проблема в том, что процесс не в реальном времени. Это будет нормально работать, если это просто анимация, но моя зависит от аудио файла. Аудиофайл будет воспроизводиться во время рендеринга, что приводит к глючному видео в формате 1FPS.
Возможное решение?
Не воспроизводить аудиофайл в реальном времени, но преобразовать аудиофайл в необработанные данные. Анимируйте аудио-визуализацию на основе исходных данных. Не уверен, как это сделать, и если это вообще возможно.
Solution # 2
Воспроизведите, запишите и сохраните анимацию, все в интерфейсе. Может использовать ccapture. js для записи и сохранения холста. Используйте безголовый браузер, чтобы открыть страницу и сохранить ее на диск после завершения воспроизведения. Не похоже, что это лучшее решение.
Проблема (и)
У меня более 1 холста. Это занимает некоторое время, особенно если аудиофайл длиннее 10 минут. Заставить пользователей долго ждать может быть нарушителем договоренности.
Возможное решение?
Объединить холсты в один.
Не знаю, как ускорить время рендеринга, и я сомневаюсь, что это возможно таким образом.
Я застрял с этой проблемой в течение нескольких дней, нет. Это значило бы, что многие из вас могли бы потратить минуту своего времени, чтобы указать мне правильное направление. Большое спасибо за ваше время заранее!