isxam
@isxam

Какие использовать инструменты для создания динамического видео программно?

Есть задача генерации программной генерации видеофайла по данным.

На входе есть некие данные, например список слов/изображений, привязанных ко времени. Необходимо создать сцену, разместить там объекты, согласно данным, менять их с течением времени, анимировать, добавить аудио и вывести результат в файл.

Рассматривал вариант с рисованием на canvas api браузера в headless режиме (есть много либ для рисования) и через puppeteer захват скриншотов и генерация видео. Но появляются проблемы с аудио, с привязкой времени внутри веб приложения к фреймам видео из-за возможных подвисаний. И вообще этот подход с web view кажется костыльным.

Хотелось узнать тулы, которые являются best practice в этой сфере и как в идеальном случае это решается.
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
gbg
@gbg
Баянист. Тамада. Услуги.
Blender и сценарии на питончике
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
makssof
@makssof
Web-разработчик
Как вариант, курить в сторону FFMpeg. У него куча врапперов для всевозможных языков.
А вообще, что за язык?
Ответ написан
ShockWave2048
@ShockWave2048
imposter
Как раз работаю с подобным проектом, для создания видео, WPF/.Net.

Первая библиотека - Accord.Video.FFMPEG;
Пример:
writer = new VideoFileWriter();
writer.Open("_temp.mkv", 1280, 720, 5, VideoCodec.MPEG4, 1900000);
// Затем закидываем кадры:
RenderTargetBitmap rtb = new RenderTargetBitmap(
            (int)canvas.ActualWidth, (int)canvas.ActualHeight, 96, 96,
                 PixelFormats.Default);
rtb.Render(canvas);
var bi = rtb.GetBitmap(1280, 720);
writer.WriteVideoFrame(bi);
С чего хватать кадры, не важно, у меня Canvas, можно и WebView.

Звук чуть сложней, либа - NAudio.Wave
var mixer = new MixingSampleProvider();
// Закидываем звук по времени.
var off = new OffsetSampleProvider(sampleSource);
off.DelayBy = TimeSpan.FromSeconds(sec);
mixer.AddMixerInput(off);
// Энкодим в файл
MediaFoundationEncoder.EncodeToMp3(mixer.ToWaveProvider16(), audioTempFileName, AUDIO_BITRATE);
// Затем эту пару скармливаем FFMpeg
string args = @"-err_detect ignore_err -i " + audioTempFileName + " -i " +
               "_temp.mkv" + " -c copy -c:v libx264 -c:a libmp3lame -shortest " + outFileName; //libvorbis libfaac libmp3lame
RunProcess(args);
Более кардинальное решение это игровой движок Unity (C#), там море вкусностей, хотя и придется его полностью учить: 3D, GPU, камеры, запись в реальном времени и покадрово, редакторы анимаций и спец-эффектов.

Там есть компонент для записи камеры в видео файл, готовите сцену по данным, запускаете запись. Никакой возни с таймингами и промежуточным форматами.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Freeway Games Москва
До 180 000 руб.
Алиса-Центр Щербинка
До 35 000 руб.
Gargol Москва
от 100 000 руб.
26 янв. 2020, в 20:06
40000 руб./за проект
26 янв. 2020, в 19:26
3000 руб./за проект