J'ai un problème sérieux: j'ai un NSArray
avec plusieurs UIImage
objets. Ce que je veux faire maintenant, c'est créer un film à partir de ceux-ci UIImages
. Mais je ne sais pas comment faire.
J'espère que quelqu'un pourra m'aider ou m'envoyer un extrait de code qui fait quelque chose comme je veux.
Edit: Pour référence future - Après avoir appliqué la solution, si la vidéo semble déformée, assurez-vous que la largeur des images / de la zone que vous capturez est un multiple de 16. Trouvé après de nombreuses heures de lutte ici:
Pourquoi mon film d'UIImages obtient-il déformé?
Voici la solution complète (assurez-vous simplement que la largeur est multiple de 16)
http://codethink.no-ip.org/wordpress/archives/673
AVFoundation
et FFmpeg. Si vous recherchiez des informations liées à AVFoundation, n'aimeriez-vous pas voir ce fil de discussion? (Ou est-ce un consensus du Meta?)Réponses:
Jetez un œil à AVAssetWriter et au reste du framework AVFoundation . L'enregistreur a une entrée de type AVAssetWriterInput , qui à son tour a une méthode appelée appendSampleBuffer: qui vous permet d'ajouter des images individuelles à un flux vidéo. Essentiellement, vous devrez:
1) Câblez l'écrivain:
2) Démarrez une session:
3) Écrivez quelques exemples:
4) Terminez la session:
Vous devrez toujours remplir beaucoup de blancs, mais je pense que la seule partie qui reste vraiment difficile est d'obtenir un tampon de pixels à partir d'un
CGImage
:frameSize
est uneCGSize
description de votre taille de l' image cible etframeTransform
est unCGAffineTransform
qui vous permet de transformer les images lorsque vous les dessiner dans des cadres.la source
CGImage
seul pour attirer cela dans unCGBitmapContext
soutenu parCVPixelBuffer
est un gaspillage. De même, au lieu de créer un àCVPixelBuffer
chaque fois, vous devez utiliserAVAssetWriterInputPixelBufferAdaptor
des spixelBufferPool
pour recycler les tampons.appendSampleBuffer:
? BTW, j'utilise AVFoundation sous OS X.Voici le dernier code de travail sur iOS8 en Objective-C.
Nous avons dû apporter une variété de modifications à la réponse de @ Zoul ci-dessus pour qu'elle fonctionne sur la dernière version de Xcode et d'iOS8. Voici notre code de travail complet qui prend un tableau d'UIImages, les transforme en fichier .mov, l'enregistre dans un répertoire temporaire, puis le déplace vers la pellicule. Nous avons assemblé le code de plusieurs articles différents pour que cela fonctionne. Nous avons mis en évidence les pièges que nous devions résoudre pour faire fonctionner le code dans nos commentaires.
(1) Créer une collection d'UIImages
C'est la principale méthode qui crée votre AssetWriter et y ajoute des images pour l'écriture.
(2) Câblez un AVAssetWriter
(3) Démarrez une session d'écriture (REMARQUE: la méthode continue d'en haut)
(4) Terminez la session (Remarque: la méthode continue d'en haut)
(5) Convertissez vos UIImages en CVPixelBufferRef
Cette méthode vous donnera une référence de tampon de pixels CV qui est nécessaire à AssetWriter. Ceci est obtenu à partir d'un CGImageRef que vous obtenez de votre UIImage (ci-dessus).
(6) Déplacer votre vidéo vers la pellicule Comme AVAssetWriter ne peut pas écrire directement sur la pellicule, cela déplace la vidéo de "tmp / temp.mov" (ou quel que soit le nom de fichier que vous avez nommé ci-dessus) vers la pellicule.
La réponse de Zoul ci-dessus donne un joli aperçu de ce que vous allez faire. Nous avons longuement commenté ce code afin que vous puissiez ensuite voir comment cela a été fait en utilisant du code de travail.
la source
REMARQUE: il s'agit d'une solution Swift 2.1 (iOS8 +, XCode 7.2) .
La semaine dernière, j'ai décidé d'écrire le code iOS pour générer une vidéo à partir d'images. J'ai eu un peu d'expérience AVFoundation, mais je n'avais même jamais entendu parler d'un CVPixelBuffer. Je suis tombé sur les réponses sur cette page et aussi ici . Il a fallu plusieurs jours pour tout disséquer et tout remettre en place dans Swift d'une manière qui avait du sens pour mon cerveau. Voici ce que j'ai proposé.
REMARQUE: si vous copiez / collez tout le code ci-dessous dans un seul fichier Swift, il doit être compilé. Vous aurez juste besoin d'ajuster
loadImages()
et de modifier lesRenderSettings
valeurs.Partie 1: Préparer les choses
Ici, je regroupe tous les paramètres liés à l'exportation dans une seule
RenderSettings
structure.Partie 2: L'ImageAnimator
La
ImageAnimator
classe connaît vos images et utilise laVideoWriter
classe pour effectuer le rendu. L'idée est de séparer le code du contenu vidéo du code AVFoundation de bas niveau. J'ai également ajoutésaveToLibrary()
ici une fonction de classe qui est appelée à la fin de la chaîne pour enregistrer la vidéo dans la photothèque.Partie 3: Le VideoWriter
La
VideoWriter
classe fait tout le travail lourd d'AVFoundation. C'est surtout une enveloppe autourAVAssetWriter
etAVAssetWriterInput
. Il contient également un code sophistiqué écrit par pas moi qui sait comment traduire une image en un fichierCVPixelBuffer
.Partie 4: y arriver
Une fois que tout est en place, voici vos 3 lignes magiques:
la source
images = [image, image]
œuvres mais pas une seule image. Disons que je change le temps à 10 secondes, puis je vois un écran noir jusqu'à la toute dernière image. Assez étrange.J'ai pris les idées principales de Zoul et incorporé la méthode AVAssetWriterInputPixelBufferAdaptor et j'en ai fait les débuts d'un petit framework.
N'hésitez pas à le vérifier et à l'améliorer! CEMovieMaker
la source
Voici une version Swift 2.x testée sur iOS 8. Elle combine les réponses de @Scott Raposa et @Praxiteles avec le code de @acj contribué pour une autre question. Le code de @acj est ici: https://gist.github.com/acj/6ae90aa1ebb8cad6b47b . @TimBull a également fourni du code.
Comme @Scott Raposa, je n'avais même jamais entendu parler de
CVPixelBufferPoolCreatePixelBuffer
plusieurs autres fonctions, et encore moins compris comment les utiliser.Ce que vous voyez ci-dessous a été bricolé principalement par essais et erreurs et en lisant des documents Apple. Veuillez utiliser avec prudence et fournir des suggestions s'il y a des erreurs.
Usage:
Code:
la source
Voici la version swift3 comment convertir un tableau d'images en vidéo
Je l'utilise avec la capture d'écran, pour créer essentiellement une vidéo de capture d'écran, voici l'histoire complète / l'exemple complet .
la source
Je viens de traduire la réponse @Scott Raposa en swift3 (avec quelques très petits changements):
la source
Eh bien, c'est un peu difficile à implémenter en Objective-C pur ... Si vous développez pour des appareils jailbreakés, une bonne idée est d'utiliser l'outil de ligne de commande ffmpeg depuis votre application. il est assez facile de créer un film à partir d'images avec une commande comme:
Notez que les images doivent être nommées séquentiellement et également placées dans le même répertoire. Pour plus d'informations, consultez: http://electron.mit.edu/~gsteele/ffmpeg/
la source
Utilisez AVAssetWriter pour écrire des images sous forme de film. J'ai déjà répondu ici: - https://stackoverflow.com/a/19166876/1582217
la source