У меня серьезная проблема: у меня есть NSArray
несколько UIImage
объектов. Что я сейчас хочу сделать, это создать фильм из тех UIImages
. Но я понятия не имею, как это сделать.
Я надеюсь, что кто-то может помочь мне или отправить мне фрагмент кода, который делает что-то, как я хочу.
Изменить: Для дальнейшего использования - после применения решения, если видео выглядит искаженным, убедитесь, что ширина снимков / областей, которые вы снимаете, кратна 16. Найдено после многих часов борьбы здесь:
Почему мой фильм из UIImages получает искажены?
Вот полное решение (просто убедитесь, что ширина кратна 16)
http://codethink.no-ip.org/wordpress/archives/673
AVFoundation
и FFmpeg. Если вы искали информацию, связанную с AVFoundation, не хотели бы вы увидеть эту ветку? (Или это консенсус от Меты?)Ответы:
Взгляните на AVAssetWriter и остальную часть инфраструктуры AVFoundation . Устройство записи имеет тип ввода AVAssetWriterInput , который, в свою очередь, имеет метод appendSampleBuffer: он позволяет добавлять отдельные кадры в видеопоток. По сути, вам придется:
1) Провод писателя:
2) Начать сеанс:
3) Напишите несколько образцов:
4) Завершите сессию:
Вам все равно придется заполнить много пробелов, но я думаю, что единственной действительно сложной оставшейся частью является получение пиксельного буфера из
CGImage
:frameSize
этоCGSize
описание вашей целевой размер кадра иframeTransform
является ,CGAffineTransform
что позволяет преобразовать изображения , когда вы рисуете их в кадры.источник
CGImage
только в то, чтобы привлечь его кCGBitmapContext
поддержке,CVPixelBuffer
расточительно. Точно так же, вместо того, чтобы создаватьCVPixelBuffer
каждый раз, следует использоватьAVAssetWriterInputPixelBufferAdaptor
spixelBufferPool
для перезапуска буферов.appendSampleBuffer:
? Кстати, я использую AVFoundation в OS X.Вот последний рабочий код на iOS8 в Objective-C.
Нам пришлось внести множество изменений в ответ @ Zoul выше, чтобы заставить его работать на последней версии Xcode и iOS8. Вот наш полный рабочий код, который принимает массив UIImages, превращает их в файл .mov, сохраняет его во временный каталог, а затем перемещает его в список камер. Мы собрали код из нескольких разных постов, чтобы все заработало. Мы выделили ловушки, которые нам пришлось решить, чтобы код работал в наших комментариях.
(1) Создать коллекцию UIImages
Это основной метод, который создает ваш AssetWriter и добавляет к нему изображения для записи.
(2) Подключите AVAssetWriter
(3) Начните письменную сессию (ПРИМЕЧАНИЕ: метод продолжается сверху)
(4) Завершите сеанс (Примечание: метод продолжается сверху)
(5) Преобразуйте ваши UIImages в CVPixelBufferRef.
Этот метод даст вам ссылку на буфер пикселя CV, которая необходима AssetWriter. Это получено из CGImageRef, который вы получаете из вашего UIImage (выше).
(6) Переместите ваше видео в рулон камеры. Поскольку AVAssetWriter не может записывать непосредственно в рулон камеры, это перемещает видео из «tmp / temp.mov» (или любого имени файла, которое вы назвали выше) в рулон камеры.
Ответ Zoul выше дает хорошее представление о том, что вы будете делать. Мы подробно прокомментировали этот код, чтобы вы могли увидеть, как это было сделано с использованием рабочего кода.
источник
ПРИМЕЧАНИЕ. Это решение Swift 2.1 (iOS8 +, XCode 7.2). .
На прошлой неделе я решил написать код iOS для создания видео из изображений. У меня был небольшой опыт AVFoundation, но я никогда не слышал о CVPixelBuffer. Я встречал ответы на этой странице, а также здесь . Потребовалось несколько дней, чтобы разобрать все и собрать все вместе в Swift так, чтобы это имело смысл для моего мозга. Ниже то, что я придумал.
ПРИМЕЧАНИЕ. Если вы скопируете / вставите весь приведенный ниже код в один файл Swift, он должен скомпилироваться. Вам просто нужно настроить
loadImages()
иRenderSettings
значения.Часть 1: Настройка вещей
Здесь я группирую все настройки, связанные с экспортом, в одну
RenderSettings
структуру.Часть 2: ImageAnimator
ImageAnimator
Класс знает о ваших изображениях и используетVideoWriter
класс для выполнения рендеринга. Идея состоит в том, чтобы отделить код видеоконтента от низкоуровневого кода AVFoundation. Я также добавилsaveToLibrary()
сюда функцию класса, которая вызывается в конце цепочки для сохранения видео в библиотеке фотографий.Часть 3: VideoWriter
VideoWriter
Класс делает все AVFoundation тяжелое. В основном это обертка вокругAVAssetWriter
иAVAssetWriterInput
. Он также содержит причудливый код, написанный не мной, который знает, как перевести изображение вCVPixelBuffer
.Часть 4: Сделай это
Как только все на месте, это ваши 3 магические линии:
источник
images = [image, image]
работает, но одного изображения нет. Допустим, я изменил время на 10 секунд, затем я вижу черный экран до самого последнего кадра. Довольно странно.Я взял основные идеи Zoul и включил метод AVAssetWriterInputPixelBufferAdaptor и сделал из него основы небольших фреймворков.
Не стесняйтесь проверить это и улучшить это! CEMovieMaker
источник
Вот версия Swift 2.x, протестированная на iOS 8. Она сочетает в себе ответы @Scott Raposa и @Praxiteles вместе с кодом @acj, предоставленным для другого вопроса. Код от @acj находится здесь: https://gist.github.com/acj/6ae90aa1ebb8cad6b47b . @TimBull также предоставил код.
Как и @ Scott Raposa, я никогда не слышал о
CVPixelBufferPoolCreatePixelBuffer
некоторых других функциях, не говоря уже о том, как их использовать.То, что вы видите ниже, было собрано в основном методом проб и ошибок и прочтением документации Apple. Пожалуйста, используйте с осторожностью и предоставьте предложения, если есть ошибки.
Использование:
Код:
источник
Вот версия swift3, как конвертировать массив изображений в видео
Я использую его вместе с захватом экрана, чтобы в основном создать видео о захвате экрана, вот полный рассказ / полный пример .
источник
Только что перевел ответ @Scott Raposa на swift3 (с небольшими изменениями):
источник
Ну, это немного сложно реализовать в чистом Objective-C .... Если вы разрабатываете для взломанных устройств, хорошей идеей является использование инструмента командной строки ffmpeg из вашего приложения. довольно просто создать фильм из изображений с помощью команды вроде:
Обратите внимание, что изображения должны называться последовательно, а также помещаться в один и тот же каталог. Для получения дополнительной информации взгляните на: http://electron.mit.edu/~gsteele/ffmpeg/
источник
Используйте AVAssetWriter для записи изображений в качестве фильма. Я уже ответил здесь: - https://stackoverflow.com/a/19166876/1582217
источник