2015-09-01 1 views
17

J'ai fait une CollectionView de bibliothèque remplie de vidéos i Fetch du cadre de photos, j'utiliser les vignettes pour afficher toutes les vidéos différentes en utilisant la méthode suivantePhotos de la vidéo à un certain cadre

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

qui fonctionne bien. Mais mes vidéos commencent toujours par un cadre noir, donc toutes les vignettes sont noires. puis-je compenser l'image à partir de laquelle il prend une image instantanée?

Répondre

11

C'est un code que je l'ai utilisé dans mon projet qui fonctionne comme un charme pour moi

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 
} 

La fonction ci-dessus retourne l'image au 1 sec de la vidéo

C'est la façon de passer le assetUrl de votre vidéo pour obtenir la vignette

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

Je pense que vous devez regarder les bibliothèques AVFoundation pour décoder la vidéo et saisir le cadre que vous voulez.

Pour mettre à jour les espaces réservés dans la bibliothèque en consultant les documents, il semble que vous deviez créer un PHAssetChangeRequest et définir la propriété placeholderForCreatedAsset. Ensuite, vous devez demander que la modification soit effectuée par la bibliothèque dans un bloc de modification.

Remarque: Si cela vous est réservé, vous pouvez définir le cadre d'espace réservé dans Photos et cela devrait apparaître dans votre application.

8

Vous pouvez chercher l'objet AVAsset associé à

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

puis chargez cet actif dans un AVAssetImageGenerator qui est capable d'aller chercher des vignettes spécifiques à temps via

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