Как быстрее всего генерировать видео с субтитрами на node.js + ffmpeg?

Вводные:

От пользователя с сайта летят куски текста
Куски прилетают на 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 и уже их склеивать в итоге?
  • Вопрос задан
  • 838 просмотров
Пригласить эксперта
Ответы на вопрос 1
  1. можно: в промежуточных файлах использовать кодеки, допускающие контактенацию
  2. именно. Аудио лучше в pcm:
    -c:a pcm_s16le -f s16le -ar 48000 -ac 2  ... audio.pcm
    , видео в ts:
    -c:v libx264 -bsf:v h264_mp4toannexb -f mpegts  ... video.ts

    Их потом можно конкатенировать по-быстрому -i "concat:video1.ts|video2.ts"

  3. наверное быстрее один раз запустить шелл скрипт со всеми ffmpeg-командами
  4. диск достаточно быстр обычно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы