Подтвердить что ты не робот

Фотографическое изображение рамки с видео в определенном кадре

Я создал коллекцию изображений, заполненную видеороликами, которые я извлекал из фреймворка Photos, я использую миниатюры для отображения всех разных видео, используя следующий метод.

func requestImageForAsset(_ asset: PHAsset!, targetSize targetSize: CGSize, contentMode contentMode: PHImageContentMode, options options: PHImageRequestOptions!, resultHandler resultHandler: ((UIImage!, [NSObject : AnyObject]!) -> Void)!) -> PHImageRequestID

который отлично работает. Но мои видео всегда начинаются с черной рамки, поэтому все миниатюры черные. могу ли я компенсировать кадр, из которого он принимает снимок?

4b9b3361

Ответ 1

Это код, который я использовал в моем проекте, который работает как прелесть для меня

func generateThumnail(url: URL) -> UIImage? {
    let asset = AVAsset(url: url)
    let assetImgGenerate = AVAssetImageGenerator(asset: asset)
    assetImgGenerate.appliesPreferredTrackTransform = true
    assetImgGenerate.maximumSize = CGSize(width: 100, height: 100)
    let time = CMTimeMake(1, 30)

    if let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil) {
        return UIImage(cgImage: img)
    }
    return nil
}

Вышеуказанная функция вернет изображение в течение 1 секунды видео

Это способ передачи ресурса вашего видео для получения эскиза

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {

    let mediaType = info[UIImagePickerControllerMediaType] as! String
    if (mediaType == kUTTypeMovie as! String){
        let tempVideo = info[UIImagePickerControllerMediaURL] as! URL
        if let thumbnail = self.generateThumbnail(url: tempVideo) {
            // Use your thumbnail
        }

Ответ 2

Вы можете получить связанный объект AVAsset с помощью

func requestAVAssetForVideo(_ asset: PHAsset,
                options options: PHVideoRequestOptions?,
          resultHandler resultHandler: (AVAsset?,
                                 AVAudioMix?,
              [NSObject : AnyObject]?) -> Void) -> PHImageRequestID

затем загрузите этот актив в AVAssetImageGenerator, который способен извлекать миниатюры с указанием времени с помощью

func copyCGImageAtTime(_ requestedTime: CMTime,
        actualTime actualTime: UnsafeMutablePointer<CMTime>,
             error outError: NSErrorPointer) -> CGImage!

Ответ 3

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

Чтобы обновить заполнители в библиотеке, смотрящей на документы, кажется, что вам нужно создать PHAssetChangeRequest и установить на нем свойство placeholderForCreatedAsset. Затем вам нужно запросить, чтобы изменение было выполнено библиотекой в ​​блоке changeblock.

Примечание. Если это только для вашего использования, вы можете установить рамку-заполнитель в Фото, и это должно быть отражено в вашем приложении.