Как получить каждый кадр из видео и создать видео из извлеченного кадра в iOS swift4
Я новичок в iOS swift4 и мне нужна помощь по следующим вопросам.
Мне нужно извлечь каждый кадр из видео, и я должен выполнить некоторые операции с каждым кадром. И я должен создать видео из измененных кадров. Эти операции должны быть синхронными
(SYNC: извлечь один кадр -> изменить кадр -> записать кадр как видео -> перейти к следующему кадру)
(Если 5 секунд видео с 30 кадрами в секунду, то я должен получить 30*5 = 150 кадров).
Я должен извлечь кадры один за другим. Так как мне нужно выполнить какую-то операцию над каждым кадром и создать видео из этого модифицированного кадра. Видео также должно быть в тех же кадрах в секунду (30 кадров в секунду).
Я написал часть кода, основанную на некоторых примерах. Но он извлекает кадры случайным образом и получает несколько кадров за 20 секунд видео.
Я не знаю, как написать эти кадры как видео. Нужна помощь в этом тоже.
Наконец, мне нужна помощь для двух вещей
- Извлечение каждого из видео с синхронизацией
- запись выше извлеченного кадра как видео
Обе операции должны выполняться синхронно.
Код:
func selectImageFromPhotoLibrary(sender: UIButton)
{
imagePickerController.sourceType = .photoLibrary
imagePickerController.mediaTypes = ["public.image", "public.movie"]
present(imagePickerController, animated: true, completion: nil)
}
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
videoURL = info["UIImagePickerControllerMediaURL"] as? NSURL
print(videoURL ?? URL.self)
previewImageForLocalVideo(url: videoURL! as URL)
print("didFinishPickingMediaWithInfo")
dismiss(animated:true, completion: nil)
}
func previewImageForLocalVideo(url:URL) {
let asset = AVAsset(url: url)
let videoDuration = asset.duration
let imageGenerator = AVAssetImageGenerator(asset: asset)
var frameForTimes = [NSValue]()
let sampleCounts = 40
let totalTimeLength = Int(videoDuration.seconds * Double(videoDuration.timescale))
let step = totalTimeLength / sampleCounts
var img = UIImage()
imageGenerator.requestedTimeToleranceAfter = kCMTimeZero
imageGenerator.requestedTimeToleranceBefore = kCMTimeZero
for i in 0 ..< sampleCounts {
let cmTime = CMTimeMake(Int64(i * step), Int32(videoDuration.timescale))
frameForTimes.append(NSValue(time: cmTime))
}
imageGenerator.generateCGImagesAsynchronously(forTimes: frameForTimes, completionHandler: {requestedTime, image, actualTime, result, error in
DispatchQueue.main.sync {
img = UIImage(cgImage: image!)
/*Trying to extract each frame from video. For ex : 30 Frames per second */
/* Here I will pass img as input to a function and that function will perform operation on this img.
I need a logic to create video using modified img that is returned from a function */
}
})
}
Заранее спасибо.