创建视频资产时,PHAssetChangeRequest 始终返回 nil
Posted
技术标签:
【中文标题】创建视频资产时,PHAssetChangeRequest 始终返回 nil【英文标题】:PHAssetChangeRequest always returns nil when creating video assets 【发布时间】:2015-07-20 22:31:48 【问题描述】:我正在本地文档中保存一个新创建的视频文件。然后我想使用照片框架将它复制到照片库中。
问题是,即使正在写出视频(我可以确认它在那里并且可以观看),以下创建请求总是返回 nil:
[[phphotoLibrary sharedPhotoLibrary] performChanges:^
// NSString filePath points to the newly-created file in Documents directory
NSParameterAssert([[NSFileManager defaultManager] isReadableFileAtPath:filePath]);
// path looks fine
NSURL* url = [NSURL URLWithString:filePath];
PHAssetChangeRequest* createAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:url];
// got back nil from creationRequestForAssetFromVideoAtFileURL, so we will assert out here
NSParameterAssert(createAssetRequest);
completionHandler:^(BOOL success, NSError *error) ];
【问题讨论】:
【参考方案1】:不出所料,URL 就是问题所在。 url = [NSURL URLWithString:filePath]
不指向电影文件。如果我以(例如)以下方式获得url
,那很好:
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSArray *contents = [fileManager contentsOfDirectoryAtURL:documentsURL
includingPropertiesForKeys:@[]
options:NSDirectoryEnumerationSkipsHiddenFiles
error:nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"lastPathComponent == 'movie.mov'"];
NSURL* url = nil;
for (NSURL *fileURL in [contents filteredArrayUsingPredicate:predicate])
url = fileURL;
【讨论】:
让temporaryVideoURL = NSURL.fileURLWithPath(outputPath)!也可作为更改请求的输入【参考方案2】:您需要使用NSURL* url = [NSURL fileURLWithPath:filePath];
。这是我的演示代码,很适合我:
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^
NSURL *localFileUrl = [NSURL fileURLWithPath:localSavedPath];
PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromVideoAtFileURL:localFileUrl];
if (localAssetCollection != nil)
PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:localAssetCollection];
[assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]];
completionHandler:^(BOOL success, NSError *error)
];
我的演示也支持更改资产集合。
【讨论】:
以上是关于创建视频资产时,PHAssetChangeRequest 始终返回 nil的主要内容,如果未能解决你的问题,请参考以下文章
NSFileHandler 为资产库视频 url 返回 nil