IOS SWIFT генерация миниатюр - PullRequest
0 голосов
/ 06 октября 2018

Я занимаюсь разработкой видео триммера ios с помощью swift 4. Я пытаюсь отобразить горизонтальный список миниатюр видео, разбросанных по различным периодам, как из локальных видеофайлов, так и из удаленных URL-адресов.Когда я проверяю это в симуляторе, миниатюры генерируются менее чем за секунду, что нормально.Тем не менее, когда я тестирую этот код на реальном устройстве, генерация миниатюр происходит очень медленно и иногда дает сбой.Я попытался добавить фактическую генерацию изображения в фоновый поток, а затем обновить пользовательский интерфейс основного потока, когда он завершится, но, похоже, это не очень хорошо работает, и приложение несколько раз вылетает после рендеринга экрана.Я не уверен, что это потому, что я ухожу от экрана, пока задачи еще не завершены.Я пытаюсь решить эту проблему, и приложение генерирует эскизы быстрее и не вылетает.Вот код, который я использую ниже.Я был бы очень признателен за любую помощь в этом вопросе.

func renderThumbnails(view: UIView, videoURL: URL, duration: Float64) {
 var offset: Float64 = 0

 for i in 0..<self.IMAGE_COUNT{

   DispatchQueue.global(qos: .userInitiated).async {
     offset = Float64(i) * (duration / Float64(self.IMAGE_COUNT))
     let thumbnail = thumbnailFromVideo(videoUrl: videoURL,
                                                   time: CMTimeMake(Int64(offset), 1))
     DispatchQueue.main.async {
       self.addImageToView(image: thumbnail, view: view, index: i)
     }
   }
 }
}


static func thumbnailFromVideo(videoUrl: URL, time: CMTime) -> UIImage{
    let asset: AVAsset = AVAsset(url: videoUrl) as AVAsset
    let imgGenerator = AVAssetImageGenerator(asset: asset)
    imgGenerator.appliesPreferredTrackTransform = true
    do{
      let cgImage = try imgGenerator.copyCGImage(at: time, actualTime: nil)
      let uiImage = UIImage(cgImage: cgImage)
      return uiImage
    }catch{

    }
    return UIImage()
}

1 Ответ

0 голосов
/ 06 октября 2018

В первом предложении документации написано , а не , чтобы делать то, что вы делаете!И он даже говорит вам, что делать вместо этого.

Генерация отдельного изображения может потребовать декодирования большого количества видеокадров со сложными взаимозависимостями.Если вам требуется серия изображений , вы можете добиться гораздо большей эффективности, используя асинхронный метод generateCGImagesAsynchronously(forTimes:completionHandler:), который использует эффективность декодирования, аналогичную эффективности, используемой во время воспроизведения.

(Курсив мой.)

...