创建视频资产时,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的主要内容,如果未能解决你的问题,请参考以下文章

获取新创建资产的 URL,iOS 9 风格

从资产或相册中删除一个视频

无法加载资产颤振(不是资产是保存的文件)

NSFileHandler 为资产库视频 url 返回 nil

如何为 tvOS 包含 1x 1080p 和 2x 4K 视频资产

在中间人中为视频启用资产管道