Mam poważny problem: mam NSArray
kilka UIImage
przedmiotów. Teraz chcę zrobić z nich film UIImages
. Ale nie mam pojęcia, jak to zrobić.
Mam nadzieję, że ktoś może mi pomóc lub wysłać fragment kodu, który robi coś, co chcę.
Edycja: Do wykorzystania w przyszłości - po zastosowaniu rozwiązania, jeśli wideo wygląda na zniekształcone, upewnij się, że szerokość przechwytywanych obrazów / obszarów wynosi wielokrotność 16. Znaleziono po wielu godzinach walki tutaj:
Dlaczego mój film z UIImages dostaje zniekształcony?
Oto kompletne rozwiązanie (upewnij się, że szerokość jest wielokrotnością liczby 16)
http://codethink.no-ip.org/wordpress/archives/673
AVFoundation
i FFmpeg. Jeśli szukasz informacji związanych z AVFoundation, nie chciałbyś zobaczyć tego wątku? (Czy jest to konsensus Meta?)Odpowiedzi:
Spójrz na AVAssetWriter i resztę frameworku AVFoundation . Moduł zapisujący ma wejście typu AVAssetWriterInput , które z kolei ma metodę o nazwie appendSampleBuffer: która pozwala dodawać pojedyncze klatki do strumienia wideo. Zasadniczo będziesz musiał:
1) Podłącz pisarz:
2) Rozpocznij sesję:
3) Napisz kilka próbek:
4) Zakończ sesję:
Nadal będziesz musiał wypełnić wiele spacji, ale myślę, że jedyną naprawdę trudną częścią jest uzyskanie bufora pikseli z
CGImage
:frameSize
jestCGSize
opisując swoją docelową wielkość ramki iframeTransform
toCGAffineTransform
, że pozwala przekształcać obrazy kiedy narysować je w ramki.źródło
CGImage
tylko wyciągnąć że wCGBitmapContext
poparteCVPixelBuffer
jest marnotrawstwem. Podobnie, zamiast tworzeniaCVPixelBuffer
każdym razem,AVAssetWriterInputPixelBufferAdaptor
nic niepixelBufferPool
powinny być wykorzystywane do buforów odtworzenia.appendSampleBuffer:
? BTW, używam AVFoundation w OS X.Oto najnowszy działający kod na iOS8 w Objective-C.
Musieliśmy wprowadzić szereg drobnych poprawek do powyższej odpowiedzi @ Zoul, aby działała na najnowszej wersji Xcode i iOS8. Oto nasz kompletny działający kod, który pobiera tablicę UIImages, przekształca je w plik .mov, zapisuje go w katalogu tymczasowym, a następnie przenosi do rolki kamery. Zebraliśmy kod z wielu różnych postów, aby to działało. Podkreśliliśmy pułapki, które musieliśmy rozwiązać, aby kod działał w naszych komentarzach.
(1) Utwórz kolekcję magów UII
Jest to główna metoda, która tworzy AssetWriter i dodaje do niego obrazy do pisania.
(2) Połącz ze sobą AVAssetWriter
(3) Rozpocznij sesję pisania (UWAGA: metoda jest kontynuowana od góry)
(4) Zakończ sesję (Uwaga: Metoda kontynuowana od góry)
(5) Konwertuj twoich UIImages na CVPixelBufferRef
Ta metoda da ci odniesienie do bufora pikseli CV, które jest potrzebne AssetWriter. Jest to uzyskiwane z CGImageRef, który otrzymujesz od swojego UIImage (powyżej).
(6) Przenieś swój film na rolkę kamery Ponieważ AVAssetWriter nie może zapisywać bezpośrednio na rolce kamery, powoduje to przeniesienie filmu z „tmp / temp.mov” (lub jakiejkolwiek innej nazwy pliku powyżej) na rolkę kamery.
Powyższa odpowiedź Zoula zawiera ładny zarys tego, co będziesz robić. Szczegółowo skomentowaliśmy ten kod, abyś mógł zobaczyć, jak to zrobiono za pomocą działającego kodu.
źródło
UWAGA: Jest to rozwiązanie Swift 2.1 (iOS8 +, XCode 7.2) .
W zeszłym tygodniu postanowiłem napisać kod iOS, aby wygenerować wideo z obrazów. Miałem trochę doświadczenia z AVFoundation, ale nigdy nie słyszałem o CVPixelBuffer. Odpowiedzi znalazłem na tej stronie, a także tutaj . Przeanalizowanie wszystkiego zajęło kilka dni i poskładanie wszystkiego w Swift w sposób, który miał sens dla mojego mózgu. Poniżej wymyśliłem.
UWAGA: Jeśli skopiujesz / wkleisz cały poniższy kod do jednego pliku Swift, powinien on się skompilować. Musisz tylko dostosować
loadImages()
iRenderSettings
wartości.Część 1: Konfigurowanie rzeczy
Tutaj grupuję wszystkie ustawienia związane z eksportem w jedną
RenderSettings
strukturę.Część 2: ImageAnimator
ImageAnimator
Klasa wie o swoich obrazach i wykorzystujeVideoWriter
klasę wykonać rendering. Chodzi o to, aby oddzielić kod treści wideo od kodu AVFoundation niskiego poziomu. Dodałem takżesaveToLibrary()
tutaj jako funkcję klasy, która jest wywoływana na końcu łańcucha, aby zapisać wideo w bibliotece zdjęć.Część 3: VideoWriter
VideoWriter
Klasa robi wszystko AVFoundation dźwiganie ciężarów. Jest to głównie opakowanie dookołaAVAssetWriter
iAVAssetWriterInput
. Zawiera także fantazyjny kod napisany przeze mnie, który wie jak przetłumaczyć obraz naCVPixelBuffer
.Część 4: Niech się stanie
Gdy wszystko jest na swoim miejscu, są to 3 magiczne linie:
źródło
images = [image, image]
działa, ale pojedynczy obraz nie. Powiedzmy, że zmieniam czas na 10 sekund, a następnie widzę czarny ekran do ostatniej klatki. Trochę dziwne.Wziąłem główne pomysły Zoul i włączyłem metodę AVAssetWriterInputPixelBufferAdaptor i stworzyłem z niej początki małych frameworków.
Sprawdź to i popraw! CEMovieMaker
źródło
Oto wersja Swift 2.x przetestowana na iOS 8. Łączy ona odpowiedzi @Scott Raposa i @Praxiteles wraz z kodem z @acj przyczyniła się do kolejnego pytania. Kod z @acj jest tutaj: https://gist.github.com/acj/6ae90aa1ebb8cad6b47b . @TimBull również podał kod.
Podobnie jak @Scott Raposa, nigdy nie słyszałem o
CVPixelBufferPoolCreatePixelBuffer
kilku innych funkcjach, nie mówiąc już o tym, jak ich używać.To, co widzisz poniżej, zostało zebrane głównie metodą prób i błędów oraz z czytania dokumentów Apple. Używaj z rozwagą i przedstawiaj sugestie w przypadku błędów.
Stosowanie:
Kod:
źródło
Oto wersja swift3 jak przekonwertować tablicę Obrazy na wideo
Używam go razem z przechwytywaniem ekranu, aby w zasadzie stworzyć wideo z przechwytywania ekranu, oto pełna historia / pełny przykład .
źródło
Właśnie przetłumaczono odpowiedź @Scott Raposa na swift3 (z niewielkimi zmianami):
źródło
Cóż, jest to trochę trudne do zaimplementowania w czystym Objective-C .... Jeśli tworzysz dla urządzeń z jailbreakem, dobrym pomysłem jest użycie narzędzia wiersza polecenia ffmpeg z poziomu aplikacji. tworzenie filmu z obrazów za pomocą polecenia takiego jak:
Pamiętaj, że obrazy muszą być kolejno nazywane, a także umieszczane w tym samym katalogu. Aby uzyskać więcej informacji, spójrz na: http://electron.mit.edu/~gsteele/ffmpeg/
źródło
Użyj AVAssetWriter do zapisywania zdjęć jako filmów. Odpowiedziałem już tutaj: - https://stackoverflow.com/a/19166876/1582217
źródło