Intro:
Мы получаем с сайта несколько фрагментов текста. Pieces прибывают на node.js-сервер
На выходе нам нужно получить видео, объединенное из всех фрагментов.Текст, озвученный машинным голосом, с добавленными субтитрами и звуковой подложкой.Чтобы этот пользователь мог поделиться этим видео в социальных сетях.Формат MKV не поддерживается VK.com
Варианты, которые мы попробовали: 1. Получить весь текст одновременно, сгенерировать всю речь, создать файл с субтитрами, записать субтитры в видео .mp4(vk.com не поддерживает контейнер .mkv).Для 45-секундного видео на локальном компьютере потребовалось 12 секунд операций.2. Создайте аудио и видео файлы для каждого фрагмента текста (с добавленными субтитрами).Это заняло одну секунду для одного фрагмента текста.По последнему запросу мы объединяем все части вместе.Последний запрос (объединение) занял 2-3 секунды , что уже терпимо.
Второй вариант выглядит приемлемым с точки зрения скорости, но если вы одновременно запускаете 50 клиентов,затем компьютер (тестировался на MacBook PRO 2013, 2,4 ГГц i7, 8 ГБ 1600 МГц DDR3, SSD 256 ГБ) обрабатывал только 1 фрагмент из 1 клиента за 60 секунд ( 60 раз медленнее )затем компьютер завис.
Используемые нами команды:
- Запись субтитров и обрезка до условных 6 секунд(в коде отправить unix timestamp)
ffmpeg -i import / back.mov -i export_0 / tmp.srt -scodec mov_text -t 6 export_0 / output.mov
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
Вопросы , которые мучают:
Это быстрее?
Могу ли я использовать другие кодекиили методы склейки без перекодирования?
Попробуйте вызвать ffmpeg напрямую без обертки?(фактически это дает 50-100 мс скорости)
Старайтесь не сохранять на диск, а записывать данные в Stream и объединять их вместе в конце?