Saya punya masalah serius: Saya punya NSArray
beberapa UIImage
benda. Apa yang sekarang ingin saya lakukan, adalah membuat film dari itu UIImages
. Tetapi saya tidak tahu bagaimana melakukannya.
Saya harap seseorang dapat membantu saya atau mengirim saya potongan kode yang melakukan sesuatu seperti yang saya inginkan.
Sunting: Untuk referensi di masa mendatang - Setelah menerapkan solusi, jika video terlihat terdistorsi, pastikan lebar gambar / area yang Anda tangkap adalah kelipatan 16. Ditemukan setelah berjam-jam perjuangan di sini:
Mengapa film saya dari UIImages mendapat terdistorsi?
Ini adalah solusi lengkap (hanya pastikan lebar adalah kelipatan 16)
http://codethink.no-ip.org/wordpress/archives/673
AVFoundation
dan FFmpeg. Jika Anda mencari info terkait AVFoundation, tidakkah Anda ingin melihat utas ini? (Atau apakah itu konsensus dari Meta?)Jawaban:
Lihatlah AVAssetWriter dan sisa kerangka kerja AVFoundation . Penulis memiliki input tipe AVAssetWriterInput , yang pada gilirannya memiliki metode yang disebut appendSampleBuffer: yang memungkinkan Anda menambahkan frame individual ke aliran video. Pada dasarnya Anda harus:
1) Kirim penulis:
2) Mulai sesi:
3) Tulis beberapa sampel:
4) Selesaikan sesi:
Anda masih harus mengisi banyak bagian yang kosong, tetapi saya pikir satu-satunya bagian yang sangat sulit adalah mendapatkan penyangga piksel dari
CGImage
:frameSize
adalahCGSize
menggambarkan ukuran bingkai target Anda danframeTransform
adalahCGAffineTransform
yang memungkinkan Anda mengubah gambar saat Anda menggambarnya menjadi bingkai.sumber
CGImage
hanya untuk menarik itu keCGBitmapContext
didukung olehCVPixelBuffer
adalah sia-sia. Demikian pula, bukan menciptakanCVPixelBuffer
setiap kali,AVAssetWriterInputPixelBufferAdaptor
'spixelBufferPool
harus digunakan untuk buffer recycle.appendSampleBuffer:
? BTW, saya menggunakan AVFoundation di OS X.Berikut adalah kode kerja terbaru pada iOS8 di Objective-C.
Kami harus membuat berbagai tweak untuk jawaban @ Zoul di atas untuk membuatnya berfungsi pada Xcode dan iOS8 versi terbaru. Berikut ini adalah kode kerja lengkap kami yang mengambil array UIImages, membuatnya menjadi file .mov, menyimpannya ke direktori temp, kemudian memindahkannya ke rol kamera. Kami mengumpulkan kode dari beberapa pos berbeda untuk membuatnya berfungsi. Kami telah menyoroti jebakan yang harus kami pecahkan untuk membuat kode berfungsi di komentar kami.
(1) Buat koleksi UIImages
Ini adalah metode utama yang membuat AssetWriter Anda dan menambahkan gambar untuk itu untuk ditulis.
(2) Sambungkan AVAssetWriter
(3) Mulai Sesi penulisan (CATATAN: metode ini melanjutkan dari atas)
(4) Selesaikan Sesi (Catatan: Metode berlanjut dari atas)
(5) Ubah UIImages Anda menjadi CVPixelBufferRef
Metode ini akan memberi Anda referensi buffer piksel CV yang diperlukan oleh AssetWriter. Ini diperoleh dari CGImageRef yang Anda dapatkan dari UIImage Anda (di atas).
(6) Pindahkan Video Anda ke Rol Kamera Karena AVAssetWriter tidak dapat menulis langsung ke rol kamera, ini memindahkan video dari "tmp / temp.mov" (atau nama file apa pun yang Anda beri nama di atas) ke rol kamera.
Jawaban Zoul di atas memberikan garis besar yang bagus tentang apa yang akan Anda lakukan. Kami banyak mengomentari kode ini sehingga Anda dapat melihat bagaimana hal itu dilakukan dengan menggunakan kode kerja.
sumber
CATATAN: Ini adalah solusi Swift 2.1 (iOS8 +, XCode 7.2) .
Minggu lalu saya mulai menulis kode iOS untuk menghasilkan video dari gambar. Saya memiliki sedikit pengalaman AVFoundation, tetapi belum pernah mendengar tentang CVPixelBuffer. Saya menemukan jawaban di halaman ini dan juga di sini . Butuh beberapa hari untuk membedah semuanya dan menyatukannya kembali di Swift dengan cara yang masuk akal bagi otak saya. Di bawah ini adalah apa yang saya pikirkan.
CATATAN: Jika Anda menyalin / menempelkan semua kode di bawah ini ke dalam file Swift tunggal, itu harus dikompilasi. Anda hanya perlu mengubah
loadImages()
danRenderSettings
nilainya.Bagian 1: Menyiapkan segalanya
Di sini saya mengelompokkan semua pengaturan terkait ekspor ke dalam satu
RenderSettings
struct.Bagian 2: ImageAnimator
The
ImageAnimator
kelas tahu tentang gambar dan menggunakanVideoWriter
kelas untuk melakukan rendering. Idenya adalah untuk menjaga kode konten video terpisah dari kode AVFoundation tingkat rendah. Saya juga menambahkan disaveToLibrary()
sini sebagai fungsi kelas yang dipanggil di akhir rantai untuk menyimpan video ke Perpustakaan Foto.Bagian 3: Penulis Video
The
VideoWriter
kelas melakukan semua angkat AVFoundation berat. Ini sebagian besar pembungkus di sekitarAVAssetWriter
danAVAssetWriterInput
. Ini juga berisi kode mewah yang ditulis oleh bukan saya yang tahu bagaimana menerjemahkan gambar menjadiCVPixelBuffer
.Bagian 4: Wujudkan
Setelah semuanya ada, ini adalah 3 garis ajaib Anda:
sumber
images = [image, image]
karya tetapi satu gambar tidak. Katakanlah saya mengubah waktu ke 10detik, lalu saya melihat layar hitam hingga bingkai terakhir. Cukup aneh.Saya mengambil ide-ide utama Zoul dan memasukkan metode AVAssetWriterInputPixelBufferAdaptor dan membuat awal dari kerangka kerja kecil dari itu.
Jangan ragu untuk memeriksanya dan memperbaikinya! CEMovieMaker
sumber
Berikut ini adalah versi Swift 2.x yang diuji pada iOS 8. Ini menggabungkan jawaban dari @Scott Raposa dan @Praxiteles bersama dengan kode dari @acj berkontribusi untuk pertanyaan lain. Kode dari @acj ada di sini: https://gist.github.com/acj/6ae90aa1ebb8cad6b47b . @TimBull juga menyediakan kode.
Seperti @Scott Raposa, saya bahkan belum pernah mendengar
CVPixelBufferPoolCreatePixelBuffer
dan beberapa fungsi lainnya, apalagi mengerti cara menggunakannya.Apa yang Anda lihat di bawah dirakit sebagian besar oleh coba-coba dan dari membaca dokumen Apple. Harap gunakan dengan hati-hati, dan berikan saran jika ada kesalahan.
Pemakaian:
Kode:
sumber
Inilah versi swift3 cara mengonversi array Gambar ke Video
Saya menggunakannya bersama dengan screen capture, pada dasarnya membuat video screen capture, inilah kisah lengkap / contoh lengkapnya .
sumber
Baru saja menerjemahkan @Scott Raposa jawaban ke swift3 (dengan sedikit perubahan):
sumber
Nah ini agak sulit untuk diterapkan di Objective-C murni .... Jika Anda mengembangkan untuk perangkat yang sudah di-jailbreak, ide yang bagus adalah menggunakan alat command-line ffmpeg dari dalam aplikasi Anda. cukup mudah untuk membuat film dari gambar dengan perintah seperti:
Perhatikan bahwa gambar harus dinamai secara berurutan, dan juga ditempatkan di direktori yang sama. Untuk informasi lebih lanjut, lihat: http://electron.mit.edu/~gsteele/ffmpeg/
sumber
Gunakan AVAssetWriter untuk menulis gambar sebagai film. Saya sudah menjawab di sini: - https://stackoverflow.com/a/19166876/1582217
sumber