2017-10-21 53 views
1

Je suis relativement nouveau à Swift.Swift3: Affichage de la vidéo en vue de la collection

J'essaie actuellement de récupérer des vidéos stockées dans la photothèque et de les afficher dans une vue de collection. Après avoir sélectionné une vidéo dans la vue de collection, je veux être en mesure de lire la vidéo.

En ce moment j'ai écrit une partie de la fonction grabVideos et j'ai 2 questions:

  1. Comment dois-je stocker ces vidéos? Peuvent-ils être stockés en tant que UIImages? Beaucoup d'autres sources que j'ai trouvées ont capturé des vidéos de sources en ligne et ils ont simplement stocké l'URL de la vidéo
  2. Que dois-je faire dans le résultatHandler? Je suppose que des thats étaient je stocke mes vidéos dans un tableau global

Note: le code ci-dessous dans une fonction appelée getVideos()

let imgManager = PHImageManager.default() 
    let requestOption = PHVideoRequestOptions() 
    requestOption.isSynchronous = true 
    requestOption.deliveryMode = .highQualityFormat 

    let fetchOption = PHFetchOptions() 
    fetchOption.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 

    if let fetchResult:PHFetchResult = PHAsset.fetchAssets(with: .video, options: fetchOption) { 

     if fetchResult.count > 0 { 
      for i in 0...fetchResult.count { 
       imgManager.requestAVAsset(forVideo: fetchResult.object(at: i) as! PHAsset, options: requestOption, resultHandler: {{ (<#AVAsset?#>, <#AVAudioMix?#>, <#[AnyHashable : Any]?#>) in 
        <#code#> 
        }}) 
      } 
     } else { 
      print("Error: No Videos Found") 
     } 
    } 
+0

Vous voulez afficher la vidéo ou miniature de la vidéo (par exemple une image clé de la vidéo) – Ladislav

+0

je veux afficher une vignette dans la vue de la collecte, mais après la sélection, je veux lire la vidéo –

Répondre

0

D'abord, vous ajouter une variable à votre ViewController var fetchResults: PHFetchResult<PHAsset>?

Ensuite, vous exécutez l'opération d'extraction en viewDidLoad par exemple

let fetchOption = PHFetchOptions() 
    fetchOption.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)] 

let fetchResults = PHAsset.fetchAssets(with: .video, options: fetchOption); 
self.fetchResults = fetchResults 

if fetchResults.count == 0 { 
    print("Error: No Videos Found") 
    return 
} 

dans votre collectionViewCell vous devez ajouter un UIImageView afin que nous puissions montrer miniature dans chaque cellule, vous venez de faire ce qui suit dans vue méthodes de collecte de sources de données

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return fetchResults?.count ?? 0 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "reuse", for: indexPath) as! TestCollectionViewCell 
    let videoAsset = fetchResults!.object(at: indexPath.item) 
    PHImageManager.default().requestImage(for: videoAsset, targetSize: cell.bounds.size, contentMode: .aspectFill, options: nil) { (image: UIImage?, info: [AnyHashable : Any]?) in 
     cell.imageView.image = image 
    } 

    return cell 
} 

Cela peut être approuvé sur, mais sera OK pour le premier essai , regardez spécifiquement à l'aide PHCachingImageManager au lieu de PHImageManager, plus à ce sujet dans les liens ci-dessous:

PHCachingImageManager

How to use PHCachingImageManager

Comment lire une vidéo de PHAsset vous pouvez trouver une réponse:

Swift - Playing Videos from iOS PHAsset