2016-12-19 1 views
2

J'essaie de comprendre, mais je ne trouve aucune information utile. Je ne ai trouvé ceci:Comment obtenir une vidéo à partir d'une photo en direct dans iOS

PHAssetResourceManager.defaultManager().writeDataForAssetResource(assetRes, 
toFile: fileURL, options: nil, completionHandler: 
{ 
    // Video file has been written to path specified via fileURL 
} 

mais j'ai honte de dire que je ne sais pas comment jouer dehors. J'ai créé un UIImagePickerController et chargé une image à partir de la pellicule.

Répondre

2

Utilisez ce code pour obtenir la vidéo de la photo en direct:

- (void)videoUrlForLivePhotoAsset:(PHAsset*)asset withCompletionBlock:(void (^)(NSURL* url))completionBlock{ 
    if([asset isKindOfClass:[PHAsset class]]){ 
     NSString* identifier = [(PHAsset*)asset localIdentifier]; 
     NSString* filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mov",[NSString stringWithFormat:@"%.0f",[[NSDate date] timeIntervalSince1970]]]]; 
     NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; 

     PHLivePhotoRequestOptions* options = [PHLivePhotoRequestOptions new]; 
     options.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat; 
     options.networkAccessAllowed = YES; 
     [[PHImageManager defaultManager] requestLivePhotoForAsset:asset targetSize:[UIScreen mainScreen].bounds.size contentMode:PHImageContentModeDefault options:options resultHandler:^(PHLivePhoto * _Nullable livePhoto, NSDictionary * _Nullable info) { 
      if(livePhoto){ 
       NSArray* assetResources = [PHAssetResource assetResourcesForLivePhoto:livePhoto]; 
       PHAssetResource* videoResource = nil; 
       for(PHAssetResource* resource in assetResources){ 
        if (resource.type == PHAssetResourceTypePairedVideo) { 
         videoResource = resource; 
         break; 
        } 
       } 
       if(videoResource){ 
        [[PHAssetResourceManager defaultManager] writeDataForAssetResource:videoResource toFile:fileUrl options:nil completionHandler:^(NSError * _Nullable error) { 
         if(!error){ 
          completionBlock(fileUrl); 
         }else{ 
          completionBlock(nil); 
         } 
        }]; 
       }else{ 
        completionBlock(nil); 
       } 
      }else{ 
       completionBlock(nil); 
      } 
     }]; 
    }else{ 
     completionBlock(nil); 
    } 
} 

Fondamentalement, ce que vous avez à faire est que vous devez d'abord chercher l'objet de votre PHLivePhotoPHAsset. Après cela, vous devrez traverser toutes les ressources d'actifs dans votre photo en direct et vérifier si elle est de type PHAssetResourceTypePairedVideo.

Si oui, vous avez votre vidéo. Maintenant, vous devrez l'enregistrer dans un répertoire temporaire comme je l'ai fait ici et utiliser ce fichier à des fins que vous pourriez avoir.

Pour lire cette vidéo, vous pouvez utiliser le code suivant:

NSURL *videoURL = [NSURL fileURLWithPath:fileUrl]; 
AVPlayer *player = [AVPlayer playerWithURL:videoURL]; 
AVPlayerViewController *playerViewController = [AVPlayerViewController new]; 
playerViewController.player = player; 
[self presentViewController:playerViewController animated:YES completion:nil]; 

Ne hésitez pas à demander si vous avez besoin d'éclaircissements.

P.S.- J'ai apporté quelques modifications à cette méthode pour supprimer la dépendance du code de mon application afin que le code ci-dessus ne soit pas testé, mais je pense que cela devrait fonctionner comme prévu.

1

La question est un peu déroutant

Tout d'abord, si vous voulez prendre la photo en direct et à photo.I en direct vous recommandons d'utiliser le Photos Framework au lieu de UIImagePickerController. De cette façon, vous pouvez récupérer l'actif et avoir plus de contrôle. Ensuite, vous pouvez lire la photo en direct en tant que mov ou la version en sourdine avec PHLivePhotoView en réglant le startPlayback(with:) sur hint ou full.

Vous pouvez consulter le code ici:

  • un repo github LivePreview vous montrer comment sélectionner la photo en direct et jouer.

Deuxièmement, si vous voulez convertir photo en direct à mov, le code collé fonctionnera et si vous voulez jouer mov directement, vous voudrez peut-être utiliser AVPlayer

Plus, WWDC fournit Example app using Photos framework