Покадровая анимация iOS, по сценарию - PullRequest
4 голосов
/ 11 мая 2011

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

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

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

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

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

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

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

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

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 11 мая 2011

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

0 голосов
/ 16 июня 2013

Ран, у тебя есть несколько вариантов.Вы не найдете «полного решения», но можно будет использовать существующие библиотеки, чтобы пропустить кучу проблем с реализацией и производительностью.Конечно, вы можете попытаться встроить все это в 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, прежде чем его можно будет загрузить или отправить по электронной почте из приложения.

...