Как получить каждый кадр из видео и создать видео из извлеченного кадра в iOS swift4

Я новичок в iOS swift4 и мне нужна помощь по следующим вопросам.

Мне нужно извлечь каждый кадр из видео, и я должен выполнить некоторые операции с каждым кадром. И я должен создать видео из измененных кадров. Эти операции должны быть синхронными

(SYNC: извлечь один кадр -> изменить кадр -> записать кадр как видео -> перейти к следующему кадру)

(Если 5 секунд видео с 30 кадрами в секунду, то я должен получить 30*5 = 150 кадров).

Я должен извлечь кадры один за другим. Так как мне нужно выполнить какую-то операцию над каждым кадром и создать видео из этого модифицированного кадра. Видео также должно быть в тех же кадрах в секунду (30 кадров в секунду).

Я написал часть кода, основанную на некоторых примерах. Но он извлекает кадры случайным образом и получает несколько кадров за 20 секунд видео.

Я не знаю, как написать эти кадры как видео. Нужна помощь в этом тоже.

Наконец, мне нужна помощь для двух вещей

  1. Извлечение каждого из видео с синхронизацией
  2. запись выше извлеченного кадра как видео

Обе операции должны выполняться синхронно.

Код:

    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 */

                }
            })
        }

Заранее спасибо.

0 ответов

Другие вопросы по тегам