Tengo un problema grave: tengo un NSArray
con varios UIImage
objetos. Lo que ahora quiero hacer es crear películas a partir de ellos UIImages
. Pero no tengo idea de cómo hacerlo.
Espero que alguien pueda ayudarme o enviarme un fragmento de código que haga algo como yo quiero.
Editar: para referencia futura: después de aplicar la solución, si el video parece distorsionado, asegúrese de que el ancho de las imágenes / área que está capturando sea un múltiplo de 16. Encontrado después de muchas horas de lucha aquí:
¿Por qué mi película de UIImages se pone ¿distorsionado?
Aquí está la solución completa (solo asegúrese de que el ancho sea múltiplo de 16)
http://codethink.no-ip.org/wordpress/archives/673
AVFoundation
y FFmpeg. Si estaba buscando información relacionada con AVFoundation, ¿no le gustaría ver este hilo? (¿O es un consenso de Meta?)Respuestas:
Eche un vistazo a AVAssetWriter y al resto del marco de AVFoundation . El escritor tiene una entrada de tipo AVAssetWriterInput , que a su vez tiene un método llamado appendSampleBuffer: que le permite agregar cuadros individuales a una secuencia de video. Esencialmente tendrás que:
1) Cablear al escritor:
2) Comience una sesión:
3) Escribe algunas muestras:
4) Termina la sesión:
Todavía tendrá que rellenar muchos espacios en blanco, pero creo que la única parte realmente difícil es obtener un búfer de píxeles de a
CGImage
:frameSize
es unaCGSize
descripción del tamaño de cuadro objetivo yframeTransform
es unaCGAffineTransform
que le permite transformar las imágenes cuando las dibuja en cuadros.fuente
CGImage
recurrir a un solo para dibujar eso en unCGBitmapContext
respaldoCVPixelBuffer
. Del mismo modo, en lugar de crear unoCVPixelBuffer
cada vez, se deben usar losAVAssetWriterInputPixelBufferAdaptor
'spixelBufferPool
para reciclar los tampones.appendSampleBuffer:
? Por cierto, estoy usando AVFoundation en OS X.Aquí está el último código de trabajo en iOS8 en Objective-C.
Tuvimos que hacer una variedad de ajustes a la respuesta de @ Zoul anterior para que funcione en la última versión de Xcode e iOS8. Aquí está nuestro código de trabajo completo que toma una matriz de UIImages, los convierte en un archivo .mov, lo guarda en un directorio temporal y luego lo mueve al rollo de la cámara. Reunimos código de múltiples publicaciones diferentes para que esto funcione. Hemos destacado las trampas que tuvimos que resolver para que el código funcione en nuestros comentarios.
(1) Crear una colección de UIImages
Este es el método principal que crea su AssetWriter y le agrega imágenes para escribir.
(2) Conecte un AVAssetWriter
(3) Comience una sesión de escritura (NOTA: el método continúa desde arriba)
(4) Finalice la sesión (Nota: El método continúa desde arriba)
(5) Convierta sus UIImages en un CVPixelBufferRef
Este método le proporcionará una referencia de búfer de píxeles CV que AssetWriter necesita. Esto se obtiene de un CGImageRef que obtienes de tu UIImage (arriba).
(6) Mueva su video al carrete de la cámara Debido a que AVAssetWriter no puede escribir directamente al carrete de la cámara, esto mueve el video de "tmp / temp.mov" (o cualquier nombre de archivo que haya nombrado anteriormente) al carrete de la cámara.
La respuesta anterior de Zoul da un buen resumen de lo que harás. Comentamos ampliamente este código para que pueda ver cómo se hizo usando el código de trabajo.
fuente
NOTA: Esta es una solución Swift 2.1 (iOS8 +, XCode 7.2) .
La semana pasada me propuse escribir el código de iOS para generar un video a partir de imágenes. Tenía un poco de experiencia en AVFoundation, pero nunca había oído hablar de un CVPixelBuffer. Encontré las respuestas en esta página y también aquí . Me llevó varios días diseccionar todo y volver a armar todo en Swift de una manera que tuviera sentido para mi cerebro. A continuación se muestra lo que se me ocurrió.
NOTA: Si copia / pega todo el código a continuación en un solo archivo Swift, debe compilarse. Solo tendrá que ajustar
loadImages()
y losRenderSettings
valores.Parte 1: configurar las cosas
Aquí agrupo todas las configuraciones relacionadas con la exportación en una sola
RenderSettings
estructura.Parte 2: El animador de imágenes
La
ImageAnimator
clase conoce tus imágenes y usa laVideoWriter
clase para realizar el renderizado. La idea es mantener el código de contenido de video separado del código AVFoundation de bajo nivel. También agreguésaveToLibrary()
aquí como una función de clase que se llama al final de la cadena para guardar el video en la Biblioteca de fotos.Parte 3: El VideoWriter
La
VideoWriter
clase hace todo el trabajo pesado de AVFoundation. Es principalmente una envoltura alrededorAVAssetWriter
yAVAssetWriterInput
. También contiene un código elegante escrito por mí que no sabe cómo traducir una imagen a unCVPixelBuffer
.Parte 4: Haz que suceda
Una vez que todo esté en su lugar, estas son tus 3 líneas mágicas:
fuente
images = [image, image]
trabajos pero una sola imagen no. Digamos que cambio el tiempo a 10 segundos, luego veo una pantalla negra hasta el último fotograma. Bastante extraño.Tomé las ideas principales de Zoul e incorporé el método AVAssetWriterInputPixelBufferAdaptor e hice los comienzos de un pequeño marco fuera de él.
¡No dudes en echarle un vistazo y mejorarlo! CEMovieMaker
fuente
Aquí hay una versión de Swift 2.x probada en iOS 8. Combina las respuestas de @Scott Raposa y @Praxiteles junto con el código de @acj contribuido para otra pregunta. El código de @acj está aquí: https://gist.github.com/acj/6ae90aa1ebb8cad6b47b . @TimBull también proporcionó código también.
Al igual que @Scott Raposa, nunca había oído hablar de
CVPixelBufferPoolCreatePixelBuffer
muchas otras funciones, y mucho menos entendí cómo usarlas.Lo que ves a continuación fue improvisado principalmente por prueba y error y por leer documentos de Apple. Úselo con precaución y brinde sugerencias si hay errores.
Uso:
Código:
fuente
Aquí está la versión swift3 de cómo convertir la matriz de imágenes al video
Lo uso junto con la captura de pantalla, para crear básicamente un video de captura de pantalla, aquí está la historia completa / ejemplo completo .
fuente
Acabo de traducir la respuesta de @Scott Raposa a swift3 (con algunos cambios muy pequeños):
fuente
Bueno, esto es un poco difícil de implementar en Objective-C puro ... Si está desarrollando para dispositivos con jailbreak, una buena idea es usar la herramienta de línea de comandos ffmpeg desde el interior de su aplicación. Es bastante fácil crear una película a partir de imágenes con un comando como:
Tenga en cuenta que las imágenes deben nombrarse secuencialmente y también deben colocarse en el mismo directorio. Para obtener más información, consulte: http://electron.mit.edu/~gsteele/ffmpeg/
fuente
Use AVAssetWriter para escribir imágenes como película. Ya he respondido aquí: - https://stackoverflow.com/a/19166876/1582217
fuente