如何在 iOS 中通过 UIActivityViewController 导出 PHAsset 视频

Posted

技术标签:

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

我尝试在 ios 中导出UIActivityViewControllerPHAsset 视频。 当 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视频。

【问题讨论】:

【参考方案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 本身,而应将AVURLAssetURL 指定为activityItems。

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

编辑

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

【讨论】:

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

以上是关于如何在 iOS 中通过 UIActivityViewController 导出 PHAsset 视频的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 6+ 中通过 SKStoreProductViewController 监控下载进度?

如何在 iOS 中通过键盘显示 UIView

如何在目标c中通过ios中的XMPPFramework连接XMPP服务器

如何在 iOS 中通过语音来读取状态的全名?

如何在 iOS 应用程序中通过 UIPickerView 实现视图之间的转换?

iOS中通过蓝牙的多点连接框架:如何确定消息是不是“旧”?