доступ к видео внутри .tmp

этот код работает и сохраняет загруженный файл в фотопленку, если файл является изображением, но не сохраняет его, если это видеофайл.

    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {

    NSData * data = [NSData dataWithContentsOfURL:location];
    UIImage * image = [UIImage imageWithData:data];
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    UISaveVideoAtPathToSavedPhotosAlbum(location.path, self, @selector(video:didFinishSavingWithError: contextInfo:), nil);

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.ProgressView setHidden:NO];
    });

}

когда я получаю путь к загруженному файлу, это такой временный файл:

/private/var/mobile/Containers/Data/Application/DE97D98D-760F-48DC-AFBB-C61C5E3185A0/tmp/CFNetworkDownload_5DOCCe.tmp

и я думаю, что, поскольку UISaveVideoAtPathToSavedPhotosAlbum хочет сохранить путь к целевому видео, причина, по которой это не работает, заключается в том, что он не может получить доступ к видеофайлу внутри .tmp

пожалуйста помоги! это было довольно давно, я борюсь с этим.


person Bavafaali    schedule 14.02.2017    source источник
comment
Взгляните на это: stackoverflow.com/a/26666813/4237142   -  person Luis Mejías    schedule 14.02.2017
comment
спасибо, проверил и обновил вопрос.   -  person Bavafaali    schedule 15.02.2017


Ответы (2)


попробуйте использовать ALAssestsLibrary

@property (сильное, неатомарное) ALAssetsLibrary *library;

    NSURL *videoURL = [NSURL URLWithString:videoURLString];
    dispatch_async(dispatch_get_main_queue(), ^{
        NSURLRequest *request = [NSURLRequest requestWithURL:videoURL];
        AFURLConnectionOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
        NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:videoName];
        operation.outputStream = [NSOutputStream outputStreamToFileAtPath:filePath append:NO];
        [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {
            NSLog(@"downloadComplete! is %f",  (float)totalBytesRead / totalBytesExpectedToRead);
        }];
        [operation setCompletionBlock:^{
            NSLog(@"downloadComplete!");

            [self.library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:filePath] completionBlock:^(NSURL *assetURL, NSError *error) {
                if (error) {
                    NSLog(@"%@", error.description);
                }
                else {
                    NSLog(@"Done :)");
                    NSString *fileDownloadStatus = [NSString stringWithFormat:@"Downloading of %@ Finished", videoName];
                    [SVProgressHUD showImage:[UIImage imageNamed:@"Mp4_Icon"] status:fileDownloadStatus];
                }
            }];
        }];
        [operation start];
    });
person Fahad Jamal    schedule 15.02.2017
comment
спасибо, теперь я могу получить доступ к видео, и оно имеет формат mp4, но UIVideoAtPathIsCompatibleWithSavedPhotosAlbum считает, что оно несовместимо с Camera Roll - person Bavafaali; 16.02.2017
comment
это совместимо с рулоном камеры - person Fahad Jamal; 17.02.2017

Я нашел свое решение:

NSData * data = [NSData dataWithContentsOfURL:location];
[[NSFileManager defaultManager] moveItemAtURL:location toURL:[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] error:nil];
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsDirectory = [paths objectAtIndex:0];
    NSString * FilePath = [documentsDirectory  stringByAppendingPathComponent:jsonTitle];
    [data writeToFile:FilePath atomically:YES];

    if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(FilePath)) {

        UISaveVideoAtPathToSavedPhotosAlbum(FilePath, nil, nil, nil);
    } else {
        NSLog(@"error");
    }

    NSFileManager * removeDownloadAfterSave;
    [removeDownloadAfterSave removeItemAtPath:FilePath error:nil];
person Bavafaali    schedule 04.03.2017