Получить NSData для видеофайла с NSUrl

У меня есть файл по пути

var/mobile/Media/DCIM/100APPLE/IMG_0292.MOV

и я хочу получить NSData этого файла, но у меня возникла ошибка

Error Domain = NSCocoaErrorDomain Code = 257 «Невозможно открыть файл« IMG_0292.MOV », потому что у вас нет разрешения на его просмотр». UserInfo = {NSFilePath = / var / mobile / Media / DCIM / 100APPLE / IMG_0292.MOV, NSUnderlyingError = 0x178c9f90 {Error Domain = NSPOSIXErrorDomain Code = 1 «Операция запрещена»}}

Я пробовал с

NSError *error;
NSData *videoData = [NSData dataWithContentsOfFile:path options:NSDataReadingMappedAlways error:&error];

а также

NSError* error = nil;
NSData* data = [NSData dataWithContentsOfURL:fileURL options:NSDataReadingUncached error:&error];

и не повезло.

У меня также есть PHAsset видеофайла, но я не знаю, как получить из него NSData. Пожалуйста, помогите мне получить NSData.


person Ossir    schedule 20.12.2016    source источник
comment
Вы просили разрешения для доступа к фото-библиотеке?   -  person Jakub    schedule 20.12.2016
comment
Да. разрешение получено   -  person Ossir    schedule 20.12.2016
comment
@Ossir сделайте параметры равными нулю и попробуйте   -  person Jitendra Modi    schedule 20.12.2016


Ответы (2)


Вы не можете напрямую обращаться к URL-адресам, которые не находятся в изолированной программной среде ваших приложений (за некоторыми исключениями). Чтобы получить данные для видеофайла, воспользуйтесь следующими способами:

Для iOS 9 и выше используйте следующий метод PHAssetResource:

- (PHAssetResourceDataRequestID)requestDataForAssetResource:(PHAssetResource *)resource options:(PHAssetResourceRequestOptions *)options dataReceivedHandler:(void (^)(NSData *data))handlercompletionHandler:(void (^)(NSError *error))completionHandler;

Для iOS 8 и выше:

- (PHImageRequestID)requestExportSessionForVideo:(PHAsset *)asset options:(PHVideoRequestOptions *)options exportPreset:(NSString *)exportPreset resultHandler:(void (^)(AVAssetExportSession *exportSession, NSDictionary *info))resultHandler;

Затем прочтите NSData экспортированного URL-адреса.

person holtmann    schedule 22.12.2016

Просто для завершения .. Это сработало для меня:

    PHImageManager *manager = [PHImageManager defaultManager];
    [manager requestAVAssetForVideo:asset.baseAsset options:nil resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {

        if([asset isKindOfClass:[AVURLAsset class]]){
             //Get the url 
             NSURL *url = [(AVURLAsset *)asset URL];
        }

    }];

Надеюсь это поможет.

person amcastror    schedule 23.02.2017