Покадровая анимация iOS, по сценарию

Есть несколько вопросов SO, касающихся покадровой анимации (например, покадровая анимация и другие похожие вопросы), однако я чувствую, что мой отличается, так что вот.

Это частично вопрос дизайна от человека с очень небольшим опытом работы с ios.

Я не уверен, что «кадр за кадром» — это правильное описание того, что я хочу сделать, поэтому позвольте мне описать это. По сути, у меня есть «сценарий» анимационного фильма, и я хочу воспроизвести этот сценарий.
Этот сценарий представляет собой файл json, описывающий набор сцен. В каждой сцене есть несколько элементов, таких как фоновое изображение, список актеров с их позициями и фоновый звуковой клип. Кроме того, для каждого актера и фона есть файл изображения, который их представляет. (это немного сложнее - у каждого актера есть «поведение», например, как он моргает, как он говорит и т. д.). Поэтому моя работа состоит в том, чтобы следовать заданному сценарию, ссылаясь на актеров и фон, и в каждом кадре размещать актеров в назначенных им местах, рисовать правильный фон и воспроизводить звуковой файл.
Фильм может быть поставлен на паузу, прокручиваться вперед или назад, как и раньше. к функциям видеоплеера YouTube.
Большинство вопросов, которые я видел и которые относятся к покадровой анимации, имеют другие требования, чем мои (позже я перечислю еще некоторые требования). Обычно они предлагают использовать свойство animationImages объекта UIImageView. Это нормально для анимации кнопки или флажка, но все они предполагают наличие короткого и предопределенного набора изображений, которые необходимо воспроизвести.
Если бы я использовал анимациюImages, мне пришлось бы предварительно создать все изображения. фронт, и я чисто предполагаю, что он не будет масштабироваться (подумайте о 30 кадрах в секунду в течение одной минуты, вы получите 60 * 30 = 1800 изображений. Плюс возможности очистки и паузы/воспроизведения кажутся сложными в этом случае).

Поэтому я ищу правильный способ сделать это. Моя интуиция, и я все больше узнаю по ходу дела, заключается в том, что есть, вероятно, три или четыре основных способа добиться этого.

  1. Используя основные анимации и определяя «ключевые точки» и анимированные переходы ч/б этих ключевых точек. Например, если актеру нужно быть в точке А в момент времени t1 и в точке Б в момент времени t2, то все, что мне нужно сделать, это анимировать то, что находится между ними. Я делал что-то подобное в ActionScript в прошлом, и это было хорошо, но было особенно сложно реализовать действие очистки и синхронизировать все, поэтому я не большой поклонник этого подхода. Представьте, что вам нужно реализовать паузу в середине анимации или прокрутку до середины анимации. Это выполнимо, но не приятно.
  2. Установите таймер, скажем, 30 раз в секунду и на каждом тике сверяйтесь с моделью (модель представляет собой json-файл скрипта вместе с описанием актеров и фонов) и рисуйте то, что нужно нарисовать в это время. Используйте Quartz 2D API и drawRect. Это, вероятно, простой подход, но у меня недостаточно опыта, чтобы сказать, насколько хорошо он будет работать на разных устройствах, возможно, с точки зрения процессора, все зависит от количества вычислений, которые мне нужно сделать на каждом тике, и количества усилия, необходимые ios, чтобы нарисовать все. У меня нет предчувствия.
  3. Аналогичен варианту 2, но для рисования используется OpenGL. Я предпочитаю 2 b/c, API проще, но, возможно, больше подходит OpenGL с точки зрения ресурсов.
  4. Используйте игровой фреймворк, такой как cocos2d, которым я никогда раньше не пользовался, но который, похоже, решает больше или меньше подобных проблем. Кажется, у них хороший API, поэтому я был бы счастлив, если бы смог найти ответы на все свои требования.

Помимо требований, которые я только что описал (воспроизведение фильма с учетом его файла «сценария» и описания актеров, фонов и звуков), есть еще один набор требований —

  • Фильм должен воспроизводиться в полноэкранном режиме или в режиме частичного экрана (где остальная часть экрана предназначена для других элементов управления)
  • Я начинаю с iphone, естественно, за ним должен последовать ipad.
  • Я хотел бы иметь возможность создать эскиз этого фильма для локального использования телефона (отобразить его в галерее в моем приложении). Миниатюра может быть просто первым кадром фильма.
  • Я хочу иметь возможность «экспортировать» результат в виде фильма, что-то, что можно было бы легко загрузить на YouTube или Facebook.

Таким образом, большой вопрос здесь заключается в том, может ли какая-либо из предложенных 1-4 реализаций, которые я имею в виду (или другие, которые вы могли бы предложить), каким-либо образом экспортировать такой фильм.
Если все четыре не справятся с задачей экспорта фильма, у меня есть альтернатива. в уме. Альтернативой является использование сервера, на котором работает ffmpeg и который принимает пакет всех изображений фильмов (мне пришлось бы рисовать их в телефоне и загружать на сервер по их последовательности), а затем сервер компилировал бы все изображения. с их саундтреком к одному фильму.
Очевидно, что для простоты я бы предпочел сделать это без сервера, т.е. иметь возможность экспортировать фильм с iphone, но если это слишком много, то последнее требование будет по крайней мере, чтобы иметь возможность экспортировать набор всех изображений (ключевых кадров в фильме), чтобы я мог связать их и загрузить на сервер.

Продолжительность фильма должна составлять одну-две минуты. Надеюсь, вопрос был не слишком длинным и все понятно...

Спасибо!


person Ran    schedule 11.05.2011    source источник


Ответы (2)


хорошо написанный вопрос. для экспорта видео используйте AVFoundation (доступно с iOS 4). Если бы я собирался реализовать это, я бы попробовал № 1 или № 4. Я думаю, что № 1 может быть самым быстрым, чтобы просто попробовать, но это, вероятно, потому, что у меня нет опыта работы с cocos2d. Я думаю, вы сможете приостановить и очистить CoreAnimation: посмотрите, какой протокол CAMediaTiming он принимает.

person nielsbot    schedule 11.05.2011
comment
Спасибо, AVFoundation полезен, изучил его. Более общий вопрос о том, как реализовать такого рода анимацию, все еще открыт для всех, кто хочет попробовать. - person Ran; 12.05.2011

Ран, у тебя есть несколько вариантов. Вы не найдете «полного решения», но можно будет использовать существующие библиотеки, чтобы пропустить кучу проблем с реализацией и производительностью. Вы, конечно, можете попытаться построить все это в OpenGL, но я советую вам использовать другой подход. Я предлагаю вам отображать все «видео» кадр за кадром на устройстве на основе ваших настроек json. В основном это сводится к настройке элементов вашей сцены, а затем определению позиций каждого элемента для времени [0, 1, 2], где каждое число указывает на кадр с некоторой частотой кадров (15, 20 или 24 FPS будет более чем достаточно) . Прежде всего, взгляните на мою библиотеку нетривиальных анимаций для iOS, в ней вы найдете класс с именем AVOfflineComposition, который выполняет этап «компоновки элементов и сохранения в файл на диске». Очевидно, что этот класс не делает всего, что вам нужно, но он является хорошей отправной точкой для базовой логики создания композиции из N элементов и записи результатов в видеофайл. Смысл создания композиции в том, что весь ваш код, который считывает настройки и размещает объекты в определенном месте композиции, может быть запущен в автономном режиме, а результатом, который вы получите в конце, является видеофайл. Сравните это со всеми деталями, связанными с сохранением всех этих элементов в памяти, а затем продвигайтесь вперед быстрее или медленнее, в зависимости от того, насколько быстро все работает.

Следующим шагом будет создание 1 аудиофайла, длина которого равна «фильму» всех скомпилированных кадров, и он должен включать любые звуки в определенное время. В основном это означает микширование звука во время выполнения и сохранение результатов в выходной файл, чтобы результаты можно было легко воспроизвести с помощью AVAudioPlayer. Вы можете взглянуть на очень простой код микшера PCM, который я написал для такого рода вещей. . Но вы, возможно, захотите рассмотреть более полный звуковой движок, такой как theamazingaudioengine.

Если у вас есть аудиофайл и файл фильма, их можно воспроизвести вместе и довольно легко синхронизировать с помощью класса AVAnimatorMedia. Взгляните на этот AVSync пример исходного кода, в котором показан тщательно синхронизированный пример воспроизведение видео и показ фильма.

Ваше последнее требование может быть реализовано с помощью класса AVAssetWriterConvertFromMaxvid, он реализует логику, которая будет считывать файл фильма .mvid и записывать его как видео, закодированное в формате h.264, с использованием аппаратного кодировщика h.264 на iPhone или iPad. С этим кодом вам не нужно будет писать серверный модуль на основе ffmpeg. Кроме того, это в любом случае не сработает, потому что загрузка всего несжатого видео на ваш сервер займет слишком много времени. Вам необходимо сжать видео до формата h.264, прежде чем его можно будет загрузить или отправить по электронной почте из приложения.

person MoDJ    schedule 15.06.2013