Источник: Nuances of Programming
Если вы когда-либо задумывались о создании видео, содержащего компьютерную анимацию, эта статья для вас. Я предполагаю, что у вас уже есть код, или вы можете написать код, создающий некое изображение в виде двумерного массива пикселей. Неважно, что это за изображение, если оно помещается в массив в памяти.
Если вы сможете добраться до этой точки, в этой статье я проведу вас по оставшемуся пути. Шаг за шагом вы научитесь создавать видеофайлы в формате MP4. В итоге вы получите файл, подходящий для загрузки на YouTube, например, как этот:
План
Вот перечень шагов для создания такого видео:
- Написать код на C++, производящий изображение в массиве в памяти. Я использую простой генератор изображений множества Мандельброта, но, повторюсь, это может быть что угодно.
- Код повторяет первые два шага сотни раз, создавая по одному кадру за раз. Каждый PNG-файл содержит один неподвижный кадр видеоклипа.
Изображения множества Мандельброта
Множество Мандельброта — один из самых знаменитых фрактальных объектов. Видео выше постепенно увеличивает приближение множества Мандельброта с 1 до 100 миллионов раз. Видео занимает 30 секунд, скорость воспроизведения 30 кадров в секунду, в общей сложности 900 быстро воспроизводимых изображений. Замечательно, что вся эта красота возникает при повторении маленькой формулы:
Функция Mandelbrot в исходном файле mandelzoom.cpp повторяет эту формулу до тех пор, пока либо комплексное значение z не выйдет за пределы круга радиусом в 2 раза больше исходного, либо n (счетчик повторений) не достигнет максимального предела. Итоговое значение n определяет цвет определенного пикселя на экране.
Взгляните на функцию Palette, чтобы увидеть, как счетчик повторений конвертируется в значения красного, зеленого и синего цветов.
Создание изображения в памяти
Функция GenerateZoomFrames производит серию PNG-файлов. Каждый PNG-файл содержит изображение множества Мандельброта с другим увеличением. Разрешение изображений — 1280 на 720, стандартное для HD-видео.
Сохранение изображения в PNG-файл
Класс VideoFrame может быть полезен для приложения генератора видео. Он отображает один кадр и знает, как сохранить его в PNG-файл. Функция GenerateZoomFrames использует VideoFrame для создания каждого кадра видео фрактального приближения.
Функция-член VideoFrame::SetPixel должна вызываться приложением для каждого пикселя каждого кадра. Вы передаете структуру PixelColor, которая определяет красный, зеленый и синий компоненты пикселя. Эти значение — целые числа в диапазоне от 0 до 255.
PixelColor также содержит альфа-значение в диапазоне от 0 до 255, отображающее прозрачность пикселя. Для видео приложений следует всегда устанавливать это значение 255, что означает, что пиксель полностью непрозрачен. Я включил альфа-значение для универсальности, в случае, если вам захочется сгенерировать PNG-файлы с прозрачными областями.
Использование ffmpeg для создания видеоклипа
Я включил баш-скрипт run, автоматизирующий весь процесс создания программы mandelzoom из исходного кода, ее запуск и конвертирование полученных 900 PNG-файлов в файл видеоклипа с именем zoom.mp4. Последний шаг выполняется запуском программы ffmpeg. Вот скрипт run. он содержит несколько полезных комментариев с пояснениями к аргументам командной строки для ffmpeg.
И это все! Репозиторий mandelzoom с исходным кодом можно найти здесь.
Еще один пример
Я упоминал, что этот метод можно использовать для создания любого видео, при условии, что вы сможете написать код, создающий каждый кадр. Я закончу статью другим моим видео. Оно основано на простой трассировке лучей, которую я создал для моей книги Основы трассировки лучей. Код в этом видео работает так же, как и код выше: он создает серии PNG-файлов, которые затем ffmpeg конвертирует в MP4-файл.
Читайте также:
Читайте нас в телеграмме и vk
Перевод статьи Don Cross: Create a YouTube Video from Code