如何在 iOS 中通过 UIActivityViewController 导出 PHAsset 视频
Posted
技术标签:
【中文标题】如何在 iOS 中通过 UIActivityViewController 导出 PHAsset 视频【英文标题】:How to export PHAsset video by UIActivityViewController in iOS 【发布时间】: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
视频。
【问题讨论】:
【参考方案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 显示,但视频未附加在正文中。如果我将其发送到另一封邮件,则也没有该视频。正如我之前所说,它非常适合图像。以上是关于如何在 iOS 中通过 UIActivityViewController 导出 PHAsset 视频的主要内容,如果未能解决你的问题,请参考以下文章
如何在 iOS 6+ 中通过 SKStoreProductViewController 监控下载进度?
如何在目标c中通过ios中的XMPPFramework连接XMPP服务器