2015-07-20 5 views
3

Я сохраняю недавно созданный видеофайл в локальных документах. Затем я хотел бы скопировать его в Фотобиблиотеку, используя фреймворк.PHAssetChangeRequest всегда возвращает 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) {}]; 

ответ

0

Не удивительно, что 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; 
} 
+0

let временныйVideoURL = NSURL.fileURLWithPath (выходPath)! работает как вход для запроса изменения, а также –

0

Вы должны использовать 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) { 
}]; 

Мое демо также поддерживает изменение коллекции активов.