2015-11-23 2 views
3

Я пытаюсь получить NSData из файла mp4 из библиотеки устройств.Получить NSData из библиотеки ресурсов URL

Эта ссылка выглядеть следующим образом:

assets-library://asset/asset.mp4?id=32515720-939A-456F-958F-0B2F397416EB&ext=mp4 

Я попробовал этот код:

ALAssetRepresentation *rep = [asset defaultRepresentation]; 
Byte *buffer = (Byte*)malloc((NSUInteger)rep.size); 
NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:(NSUInteger)rep.size error:nil]; 
NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; 

Но defaultRepresentation устаревшее в прошивкой 9.

Я также попытался [NSData dataWithContentsOfFile:url];, но это возвращает ноль.

+2

не рекомендуется! = Нет – Lefteris

ответ

1

Весь класс ALAsset устарел в iOS 9. Теперь вы должны рассмотреть возможность использования PHAsset. Существует API для получения PHAsset из старого URL-адреса актива ALAsset. См. following:

Структура библиотеки объектов устарела в iOS 8.0 и более поздних версиях, заменена рамкой Photos. Используйте этот метод, если ваше приложение ранее хранило URL-адреса из объектов ALAsset, и вам нужно получить соответствующие объектные объекты Photos.

+ (PHFetchResult<PHAsset *> *)fetchAssetsWithALAssetURLs:(NSArray<NSURL *> *)assetURLs 
               options:(PHFetchOptions *)options 

И тогда вы можете использовать следующие method в PHImageManager, чтобы получить NSData в PHAsset:

- (PHImageRequestID)requestImageDataForAsset:(PHAsset *)asset 
            options:(PHImageRequestOptions *)options 
           resultHandler:(void (^)(NSData *imageData, 
                 NSString *dataUTI, 
                 UIImageOrientation orientation, 
                 NSDictionary *info))resultHandler 
1

Swift 3: актив 1. Запрос из фотографии библиотеки 2. Запрос данных от актива 3. Возвратный блок

func getDataFromAssetAtUrl(assetUrl: URL, success: @escaping (_ data: NSData) ->()){ 
    let fetchResult = PHAsset.fetchAssets(withALAssetURLs: [assetUrl], options: nil) 
    if let phAsset = fetchResult.firstObject { 
     PHImageManager.default().requestImageData(for: phAsset, options: nil) { 
      (imageData, dataURI, orientation, info) -> Void in 
      if let imageDataExists = imageData { 
       success(imageDataExists as NSData) 
      } 
     } 
    } 
} 

пример использования:

import Photos //this on top of your file 

open func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     dismiss(animated: true, completion: nil) 
     let assetUrl = assetDataFromMediaInfo(info: info)! 
     getDataFromAssetAtUrl(assetUrl: assetUrl) { (dataOfAsset) in 
      //TODO do something with NSData 
     } 
    } 
Смежные вопросы