如何从iOS中的实时照片获取video

我试图弄清楚,但找不到任何有用的信息。 我只find这个:

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

但我很惭愧地说,我不知道该怎么玩。 我创build了一个UIImagePickerController,并从相机胶卷中加载了一张图片。

使用此代码从实况照片中获取video:

 - (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); } } 

基本上你必须做的是你首先需要从PHAsset获取PHLivePhoto对象。 之后,您将必须遍历实时照片中的所有资源,并检查其是否属于PHAssetResourceTypePairedVideotypes。

如果是的话,你有你的video。 现在你需要把它保存到一个临时目录,就像我在这里所做的那样,使用这个文件来达到你想要的目的。

要播放此video,您可以使用以下代码:

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

随意问你是否需要澄清。

PS-我在这个方法做了一些改变,以消除我的应用程序的代码的依赖性,所以上面的代码是未经testing,但我觉得它应该按预期工作。

这个问题有点混乱

首先,如果你想select现场照片和播放现场照片。我build议你使用照片框架,而不是UIImagePickerController。 这样你可以获取资产并拥有更多的控制权。 然后,您可以通过设置startPlayback(with:) hintfull将现场照片作为mov或静音版本与PHLivePhotoView一起播放 。

你可以参考这里的代码:

  • 一个github回购LivePreview告诉你如何select现场照片和播放它。

其次,如果您想将实时照片转换为mov,则您粘贴的代码将会有效,如果您想直接播放mov,则可能需要使用AVPlayer

另外,WWDC提供使用Photos框架的示例应用程序