Ich habe ein ernstes Problem: Ich habe ein NSArray
mit mehreren UIImage
Objekten. Was ich jetzt tun möchte, ist, daraus einen Film zu erstellen UIImages
. Aber ich habe keine Ahnung, wie das geht.
Ich hoffe, jemand kann mir helfen oder mir einen Code-Ausschnitt schicken, der so etwas macht, wie ich will.
Bearbeiten: Zum späteren Nachschlagen - Wenn das Video nach dem Anwenden der Lösung verzerrt aussieht, stellen Sie sicher, dass die Breite der Bilder / Bereiche, die Sie aufnehmen, ein Vielfaches von 16 ist. Gefunden nach vielen Stunden des Kampfes hier:
Warum wird mein Film von UIImages verzerrt?
Hier ist die vollständige Lösung (stellen Sie einfach sicher, dass die Breite ein Vielfaches von 16 ist):
http://codethink.no-ip.org/wordpress/archives/673
AVFoundation
und FFmpeg. Wenn Sie nach Informationen zu AVFoundation suchen, möchten Sie diesen Thread nicht sehen? (Oder ist das ein Konsens von Meta?)Antworten:
Schauen Sie sich AVAssetWriter und den Rest des AVFoundation-Frameworks an . Der Writer verfügt über eine Eingabe vom Typ AVAssetWriterInput , die wiederum über eine Methode namens appendSampleBuffer verfügt , mit der Sie einem Videostream einzelne Frames hinzufügen können. Im Wesentlichen müssen Sie:
1) Verdrahten Sie den Schreiber:
2) Starten Sie eine Sitzung:
3) Schreiben Sie einige Beispiele:
4) Beenden Sie die Sitzung:
Sie müssen noch viele Lücken ausfüllen, aber ich denke, dass der einzige wirklich schwierige verbleibende Teil darin besteht, einen Pixelpuffer von einem zu erhalten
CGImage
:frameSize
ist einCGSize
Zielrahmengröße beschreibt undframeTransform
ist eine ,CGAffineTransform
die Sie die Bilder umwandeln können , wenn man sie in Rahmen zeichnen.quelle
CGImage
nur, um das in ein zu zeichnenCGBitmapContext
CVPixelBuffer
ist es verschwenderisch Unterstütztes . AnstattCVPixelBuffer
jedes Mal ein neues zu erstellen , sollten auchAVAssetWriterInputPixelBufferAdaptor
spixelBufferPool
verwendet werden, um Puffer zu recyceln.appendSampleBuffer:
? Übrigens verwende ich AVFoundation in OS X.Hier ist der neueste Arbeitscode für iOS8 in Objective-C.
Wir mussten eine Reihe von Änderungen an der obigen Antwort von @ Zoul vornehmen, damit sie auf der neuesten Version von Xcode und iOS8 funktioniert. Hier ist unser vollständiger Arbeitscode, der ein Array von UIImages aufnimmt, sie in eine .mov-Datei umwandelt, in einem temporären Verzeichnis speichert und dann auf die Kamerarolle verschiebt. Wir haben Code aus mehreren verschiedenen Posts zusammengestellt, damit dies funktioniert. Wir haben in unseren Kommentaren die Fallen hervorgehoben, die wir lösen mussten, damit der Code funktioniert.
(1) Erstellen Sie eine Sammlung von UIImages
Dies ist die Hauptmethode, mit der Sie Ihren AssetWriter erstellen und Bilder zum Schreiben hinzufügen.
(2) Verdrahten Sie einen AVAssetWriter
(3) Starten Sie eine Schreibsitzung (HINWEIS: Die Methode wird von oben fortgesetzt)
(4) Beenden Sie die Sitzung (Hinweis: Die Methode wird von oben fortgesetzt)
(5) Konvertieren Sie Ihre UIImages in ein CVPixelBufferRef
Diese Methode gibt Ihnen eine CV-Pixelpufferreferenz, die vom AssetWriter benötigt wird. Dies wird von einem CGImageRef erhalten, das Sie von Ihrem UIImage (oben) erhalten.
(6) Verschieben Sie Ihr Video auf die Kamerarolle Da AVAssetWriter nicht direkt auf die Kamerarolle schreiben kann, wird das Video von "tmp / temp.mov" (oder dem oben genannten Dateinamen) auf die Kamerarolle verschoben.
Die obige Antwort von Zoul gibt einen schönen Überblick darüber, was Sie tun werden. Wir haben diesen Code ausführlich kommentiert, damit Sie sehen können, wie er mit Arbeitscode erstellt wurde.
quelle
HINWEIS: Dies ist eine Swift 2.1-Lösung (iOS8 +, XCode 7.2). .
Letzte Woche habe ich mich vorgenommen, den iOS-Code zu schreiben, um aus Bildern ein Video zu generieren. Ich hatte ein bisschen AVFoundation-Erfahrung, aber noch nie von einem CVPixelBuffer gehört. Ich bin auf die Antworten auf dieser Seite und auch hier gestoßen . Es dauerte mehrere Tage, um alles zu zerlegen und in Swift wieder so zusammenzusetzen, dass es für mein Gehirn Sinn machte. Unten ist, was ich mir ausgedacht habe.
HINWEIS: Wenn Sie den gesamten folgenden Code in eine einzelne Swift-Datei kopieren / einfügen, sollte diese kompiliert werden. Sie müssen nur optimieren
loadImages()
und dieRenderSettings
Werte .Teil 1: Dinge einrichten
Hier gruppiere ich alle exportbezogenen Einstellungen in einer einzigen
RenderSettings
Struktur.Teil 2: Der ImageAnimator
Die
ImageAnimator
Klasse kennt Ihre Bilder und verwendet dieVideoWriter
Klasse, um das Rendern durchzuführen. Die Idee ist, den Videoinhaltscode vom Low-Level-AVFoundation-Code zu trennen. Ich habesaveToLibrary()
hier auch eine Klassenfunktion hinzugefügt , die am Ende der Kette aufgerufen wird, um das Video in der Fotobibliothek zu speichern.Teil 3: Der VideoWriter
Die
VideoWriter
Klasse macht alle AVFoundation schweres Heben. Es ist meistens eine Hülle umAVAssetWriter
undAVAssetWriterInput
. Es enthält auch ausgefallenen Code, der nicht von mir geschrieben wurde und der weiß, wie man ein Bild in ein Bild übersetztCVPixelBuffer
.Teil 4: Mach es möglich
Sobald alles an Ort und Stelle ist, sind dies Ihre 3 magischen Linien:
quelle
images = [image, image]
funktioniert, ein einzelnes Bild jedoch nicht. Angenommen, ich ändere die Zeit auf 10 Sekunden, dann sehe ich bis zum letzten Bild einen schwarzen Bildschirm. Ziemlich seltsam.Ich nahm Zouls Hauptideen und integrierte die AVAssetWriterInputPixelBufferAdaptor-Methode und machte daraus die Anfänge kleiner Frameworks.
Probieren Sie es aus und verbessern Sie es! CEMovieMaker
quelle
Hier ist eine Swift 2.x-Version, die unter iOS 8 getestet wurde. Sie kombiniert Antworten von @Scott Raposa und @Praxiteles mit Code von @acj, der für eine weitere Frage beigetragen hat. Der Code von @acj ist hier: https://gist.github.com/acj/6ae90aa1ebb8cad6b47b . @ TimBull lieferte auch Code.
Wie bei @Scott Raposa hatte ich noch nie davon gehört
CVPixelBufferPoolCreatePixelBuffer
und einigen anderen Funktionen gehört, geschweige denn verstanden, wie man sie benutzt.Was Sie unten sehen, wurde hauptsächlich durch Versuch und Irrtum und durch das Lesen von Apple-Dokumenten zusammengeschustert. Bitte seien Sie vorsichtig und machen Sie Vorschläge, wenn Fehler auftreten.
Verwendung:
Code:
quelle
Hier ist die swift3-Version, wie Sie das Images-Array in das Video konvertieren
Ich verwende es zusammen mit der Bildschirmaufnahme, um im Grunde ein Video der Bildschirmaufnahme zu erstellen. Hier ist die vollständige Geschichte / das vollständige Beispiel .
quelle
Gerade übersetzte @ Scott Raposa Antwort auf swift3 (mit einigen sehr kleinen Änderungen):
quelle
Nun, dies ist etwas schwierig in reinem Objective-C zu implementieren. Wenn Sie für Geräte mit Jailbreak entwickeln, ist es eine gute Idee, das Befehlszeilentool ffmpeg in Ihrer App zu verwenden. Es ist ganz einfach, einen Film aus Bildern mit einem Befehl wie dem folgenden zu erstellen:
Beachten Sie, dass die Bilder nacheinander benannt und im selben Verzeichnis abgelegt werden müssen. Weitere Informationen finden Sie unter: http://electron.mit.edu/~gsteele/ffmpeg/
quelle
Verwenden Sie AVAssetWriter, um Bilder als Film zu schreiben. Ich habe hier bereits geantwortet: - https://stackoverflow.com/a/19166876/1582217
quelle