【问题标题】:How to export PHAsset video by UIActivityViewController in iOS如何在 iOS 中通过 UIActivityViewController 导出 PHAsset 视频
【发布时间】:2015-01-23 12:17:37
【问题描述】:

我尝试在 iOS 中导出UIActivityViewController 的PHAsset 视频。 当 PHAsset 是图像时,它工作得很好。问题是当PHAsset 是视频时。 我有以下代码来导出PHAsset 视频,但没有附加任何内容。

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

    } 

请帮我如何导出PHAsset视频。

【问题讨论】:

    标签: ios


    【解决方案1】:

    我为此浪费了很多时间。

    最后我通过将视频保存到文档目录并使用文档目录中的文件 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];
                });     
            }
        }];
    }];
    

    【讨论】:

      【解决方案2】:

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

      所以,使用avAsset.URL 应该可以工作,avAsset 是AVURLAsset 类型的实例对象。

      编辑

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

      【讨论】:

      • 感谢您的回答,Gabbler。我将 AVURLAsset 更改为 AVURLAsset.URL,但它仍然不起作用。可以详细指导一下吗?
      • 当我点击 UIActivityViewController 中的“保存视频”选项时,它起作用了。问题出现在“邮件”选项中。当我单击“邮件”选项时,没有附加任何内容。你能指导我怎么做吗?谢谢
      • 那么解决办法是什么?
      • 您必须在 iPhone 中设置您的邮件帐户。
      • 是的。我知道。新消息对话框由 UIActivityController 显示,但视频未附加在正文中。如果我将其发送到另一封邮件,则也没有该视频。正如我之前所说,它非常适合图像。
      猜你喜欢
      • 2017-01-13
      • 2017-09-28
      • 2021-01-21
      • 2019-12-16
      • 2018-02-27
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多