我已经搜索并阅读了文档,但我似乎无法找到解决这个(看似简单的)问题的方法。我从用户的iTunes库中导出工作正常的歌曲,并且每次都没有问题地下载到用户的文档文件夹中,但视频似乎不起作用。
我让它显示MPMediaPickerController(allowsPickingMultipleItems = YES),允许用户从下载的库中选择视频或歌曲。完成后,这是我正在使用的相关代码:
- (void)mediaPicker:(MPMediaPickerController*)mediaPicker didPickMediaItems:(MPMediaItemCollection*)mediaItemCollection {
AVAssetExportSession *exportSession;
for (MPMediaItem *item in mediaItemCollection.items) {
NSURL *assetUrl = [item valueForProperty:MPMediaItemPropertyAssetURL];
MPMediaType type = [[item valueForProperty:MPMediaItemPropertyMediaType] intValue];
if (type >= MPMediaTypeMovie) {
exportSession = [[AVAssetExportSession alloc] initWithAsset:[AVAsset assetWithURL:assetUrl] presetName:AVAssetExportPreset640x480];
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
filePath = [title stringByAppendingString:@".mov"];
exportSession.outputURL = [NSURL fileURLWithPath:[[NSFileManager documentDirectory] stringByAppendingPathComponent:filePath]];
} // .. check for song-types here and set session up appropriately
[exportSession exportAsynchronouslyWithCompletionHandler:^{
// never gets into AVAssetExportSessionStatusCompleted here for videos
}
}
}
我每次得到的错误如下:
Error Domain=AVFoundationErrorDomain Code=-11820 "Cannot Complete Export" UserInfo=0x1e1a2180 {NSLocalizedRecoverySuggestion=Try exporting again., NSLocalizedDescription=Cannot Complete Export}
不是很有帮助。 :(我觉得我可能会遗漏一些明显的东西。我会以正确的方式解决这个问题吗?我试图将其“强制”为MOV格式可能是一个问题吗?或者可能需要一种不同的设置方式出口会议?
作为参考,我在iPhone 5上使用iOS 6.0.1进行测试,其baseSDK为6.0。提前感谢您提供的任何指导!
其他信息#1 :奇怪的事情。如果我将outputFileType设置为“AVFileTypeAppleM4V”,它似乎立即使用“SIGTRAP”崩溃。我想尝试M4V,因为当我执行assetURL的日志输出时,我看到类似:ipod-library:// item /item.m4v?id=12345。不知道这是否有所不同,但奇怪的是,如果我尝试m4v格式它就会崩溃。可能是因为它不在支持的文件类型列表中(参见下一个信息点)。
附加信息#2 :我得到的支持文件类型(来自“supportedFileTypes”方法的调用是:“com.apple.quicktime-movie”和“public.mpeg-4”。 “exportPresetsCompatibleWithAsset”包括所有视频,包括m4a,低/中/高质量,以及特定维度。我已经尝试了所有这些的所有组合,例如AVFileTypeQuickTimeMovie和AVFileTypeMPEG4 for fileTypes,以及所有预设,包括低/中/高,以及所有维度。我永远不会失败,我得到“无法完成导出”错误。
其他信息#3 :我也在使用5.1的部署目标。但是,是的,我尝试过6.0,它也给出了同样的错误。 :(
其他信息#4 :如果需要知道,我正在测试的电影是一个“Pilot”电视节目,一个视频,我在iTunes中看到的第一个免费的视频。所以我下载了它以便在这个应用程序中使用。
其他信息#5 :不确定这是否重要,但“hasProtectedContent”方法为AVAsset(如果我转换则返回AVURLAsset)返回YES。可能没有什么区别,但我想我会把它扔出去。
答案 0 :(得分:2)
在尝试复制问题并进行一些测试后,我强烈怀疑受保护的内容是个问题。原因如下:
我复制了你的代码,并在我的iPod Touch(第5代,iOS 6.0.1)上进行了测试,虽然不是来自媒体选择器,但我只是让它循环浏览设备上的所有视频(7它们工作得很好,并调用了完成处理程序,并在应用程序沙箱的文档目录中生成了正确的.mov文件。我将.mov文件移到我的Mac上,然后他们都玩了。
这些视频文件的hasProtectedContent为NO。
所以我放置了一个从iTunes商店获得的视频文件,并确认它的hasProtectedContent为YES。有趣的是,当我尝试从MPMediaItemPropertyAssetURL获取URL时,对于受保护/ iTunes获取的视频,我得到nil。
我强烈怀疑媒体保护是问题。
这是我使用的代码的变体。我根本没有更改您的转化代码,只是如何提供网址:
// select all the video files
MPMediaPropertyPredicate *predicate = [MPMediaPropertyPredicate predicateWithValue:[NSNumber numberWithInteger:MPMediaTypeMovie] forProperty:MPMediaItemPropertyMediaType];
MPMediaQuery *query = [[MPMediaQuery alloc] init];
[query addFilterPredicate:predicate];
NSArray *items = [query items];
// now go through them all to export them
NSString* title;
NSURL * url;
AVAssetExportSession *exportSession;
NSString *storePath;
AVAsset *theAsset;
// we fill put the output at this path
NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
// loop through the items and export
for (MPMediaItem* item in items)
{
title = [item valueForProperty:MPMediaItemPropertyTitle];
url = [item valueForProperty:MPMediaItemPropertyAssetURL];
NSLog(@"Title: %@, URL: %@",title,url);
theAsset = [AVAsset assetWithURL:url];
if ([theAsset hasProtectedContent]) {
NSLog(@"%@ is protected.",title);
} else {
NSLog(@"%@ is NOT protected.",title);
}
exportSession = [[AVAssetExportSession alloc] initWithAsset:theAsset presetName:AVAssetExportPreset640x480];
storePath = [applicationDocumentsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.mov",title]];
exportSession.outputFileType = AVFileTypeQuickTimeMovie;
exportSession.outputURL = [NSURL fileURLWithPath:storePath];
[exportSession exportAsynchronouslyWithCompletionHandler:^{
NSLog(@"done!");
}];
}
出于好奇,你在检查AVAsset exportable
旗帜吗?