2015-09-01 17 views
17

ho fatto un CollectionView biblioteca piena di video che recuperano dal quadro di foto, io uso le miniature per visualizzare tutti i diversi video utilizzando il seguente metodoFoto immagine Struttura dal video in un determinato periodo di

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

che funziona bene. Ma i miei video iniziano sempre con una cornice nera, quindi tutte le miniature sono nere. posso spostare il fotogramma da cui prende un'immagine di istantanea?

risposta

11

Questo è il codice che ho usato in il mio progetto che funziona come un fascino per me

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 funzione di cui sopra restituirà l'immagine a 1 sec del video

Questo è il modo di passare l'assetUrl del video per ottenere la miniatura

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

Penso che sia necessario guardare le librerie di AVFoundation per decodificare il video e afferrare la cornice che si desidera.

Per aggiornare i segnaposti nella libreria guardando i documenti sembra che sia necessario creare un PHAssetChangeRequest e impostare la proprietà placeholderForCreatedAsset su di esso. Quindi è necessario richiedere che la modifica venga eseguita dalla libreria all'interno di un blocco.

Nota: se questo è solo per l'uso, è possibile impostare il fotogramma segnaposto in Foto e questo dovrebbe essere riportato nell'app.

8

È possibile recuperare il AVAsset oggetto associato

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

quindi caricare tale attività in un AVAssetImageGenerator che è in grado di andare a prendere le miniature specifiche in tempo tramite

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