如何在iOS中通过UIActivityViewController导出PHAssetvideo

我试图在iOS中通过UIActivityViewController导出PHAsset Video。 当PHAsset是图像时,它工作正常。 问题是当PHAsset是video。 我有以下代码导出PHAssetvideo,但没有附加。

  var asset = getCurrentAsset() as PHAsset? if asset == nil { return } if asset?.mediaType == PHAssetMediaType.Video { PHImageManager.defaultManager().requestAVAssetForVideo(asset, options: nil) { (avAsset:AVAsset!, audioMix:AVAudioMix!, info:[NSObject : AnyObject]!) -> Void in var videoURL = avAsset as AVURLAsset var activityVC = UIActivityViewController(activityItems: [videoURL], applicationActivities: nil) activityVC.completionHandler = {(str: String!, value: Bool) -> Void in } self.presentViewController(activityVC, animated: true, completion: nil) } } 

请帮助我如何导出PHAssetvideo。

我浪费了很多时间去做这件事。

最后,我通过将video保存到文档目录并使用文档目录中的文件url来解决此问题。

 typeof(self) __weak weakSelf = self; [[PHImageManager defaultManager] requestExportSessionForVideo: self.videosAssets[index] options:nil exportPreset:AVAssetExportPresetPassthrough resultHandler:^(AVAssetExportSession *exportSession, NSDictionary *info) { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString* videoPath = [documentsDirectory stringByAppendingPathComponent:@"tempSelvi.MOV"]; NSFileManager *manager = [NSFileManager defaultManager]; NSError *error; if ([manager fileExistsAtPath:videoPath]) { BOOL success = [manager removeItemAtPath:videoPath error:&error]; if (success) { NSLog(@"Already exist. Removed!"); } } NSURL *outputURL = [NSURL fileURLWithPath:videoPath]; NSLog(@"Final path %@",outputURL); exportSession.outputFileType=AVFileTypeQuickTimeMovie; exportSession.outputURL=outputURL; [exportSession exportAsynchronouslyWithCompletionHandler:^{ if (exportSession.status == AVAssetExportSessionStatusFailed) { NSLog(@"failed"); } else if(exportSession.status == AVAssetExportSessionStatusCompleted){ NSLog(@"completed!"); dispatch_async(dispatch_get_main_queue(), ^(void) { NSArray *activityItems = [NSArray arrayWithObjects:outputURL, nil]; UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; activityViewController.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { NSError *error; if ([manager fileExistsAtPath:videoPath]) { BOOL success = [manager removeItemAtPath:videoPath error:&error]; if (success) { NSLog(@"Successfully removed temp video!"); } } [weakSelf dismissViewControllerAnimated:YES completion:nil]; }; [weakSelf presentViewController:activityViewController animated:YES completion:nil]; }); } }]; }]; 

您不应该附加AVURLAsset本身,而应该将其AVURLAsset URL指定为activityItems。

所以,使用avAsset.URL应该可以工作, avAsset是一个AVURLAssettypes的实例对象。

编辑

 let theAsset = avAsset as AVURLAsset let videoURL = theAsset.URL var activityVC = UIActivityViewController(activityItems: [videoURL], applicationActivities: nil)