Вводные:
От пользователя с сайта летят куски текста
Куски прилетают на node.js-сервер
На выходе нужно получить видео, склеенное из всех кусков текста, озвученное машинным голосом, с добавленными субтитрами и аудио подложкой. Чтобы его можно было пошарить в соц. сети (vk не принимает формат .mkv)
Варианты, которые попробовали:
1. Получать весь текст разом, генерировать всю речь, формировать файл с субтитрами, прожигать субтитры в видео (вк не поддерживает .mkv-контейнер) и отдавать. Занимало 12 секунд операций на 45-секундное видео на локальном компе.
2. На каждый кусок текста генерировать аудио и видео файлы (с добавленными субтитрами). На один кусок для одного клиента уходила
1 секунда. На финальный запрос только все склеивать и отдавать склееное. Последний запрос занимал 2-3 секунды, что уже терпимо.
2 вариант выглядит приемлимым по скорости работы, но если запустить одновременно 50 клиентов, то комп (тестировали на MacBook PRO 2013, 2.4 GHz i7, 8gb 1600 Mhz DDR3, SSD 256gb) обрабатывал
только 1 кусок от 1 клиента за 60 секунд (в 60 раз медленнее), затем комп зависал намертво.
Генерация аудио сделана через Amazon Polly
Генерация субтитров через
https://github.com/gsantiago/subtitle.js#readme
Из node.js вызываем ffmpeg с помощью
https://github.com/fluent-ffmpeg/node-fluent-ffmpeg
Разрешение видео - 1280х720
Используемые команды:
ffmpeg -i import/back.mov -i export_0/tmp.srt -scodec mov_text -t 6 export_0/output.mov
- прожиг видео субтитрами и обрезка до условных 6 секунд (в коде отправляем unix timestamp)
ffmpeg -i audio1.mp3 .... -i audio15.mp3 merged.mp3
- склейка всех аудио
ffmpeg -i merged.mp3 -i back.mp3 -filter_complex amerge -ac 2-c:a libmp3lame -q:a 4 -shortest audio.mp3
- наложение аудио-подложки на текст
ffmpeg -i video.txt -f concat -c copy video.mp4
- склеивание всех видео
ffmpeg -i audio.mp3 -i video.mp4 -i test.mp4 -i export/output.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 -shortest output.mp4
- наложение аудио на видео
Вопросы, которые мучают:
1. Можно ли быстрее?
2. Может быть использовать другие кодеки или способы склейки без перекодирования?
3. Пробовать вызывать команды ffmpeg напрямую без обертки? (на деле дает 50-100мс скорости)
4. Попробовать не сохранять на диск, а писать данные в Stream и уже их склеивать в итоге?