1. 程式人生 > >iOS通過PHAsset/MediaPlayer獲取本地照片、視訊、音訊學習總結

iOS通過PHAsset/MediaPlayer獲取本地照片、視訊、音訊學習總結

得閒記錄並回顧一下本地資源獲取方式,有不正確的地方,還望指正。

背景介紹

需求:獲取並展示iOS裝置記憶體儲的圖片、音訊、視訊 環境:Xcode10 庫:PHPhotos.h,MediaPlayer

說明:裝置內圖片來自於相簿,視訊來自於相簿和媒體庫,音訊來於自媒體庫。

標頭檔案引用:

#import <Photos/Photos.h>

一、獲取本地圖片、音訊、視訊

第一步:判斷相簿許可權,遍歷相簿資源

1.判斷相簿許可權

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
        //status == PHAuthorizationStatusDenied 使用者已經明確否認了許可權的訪問
        //status == PHAuthorizationStatusRestricted 此應用程式沒有被授權訪問的照片資料。可能是家長控制權限
        //status == PHAuthorizationStatusNotDetermined 使用者尚未做出選擇這個應用程式的問候
        //status == PHAuthorizationStatusAuthorized 使用者已經授權應用訪問照片資料
    }];

第二步:如果有訪問許可權,則遍歷相簿資源

1.如果想獲取系統建立的相簿:

PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

如果想獲取自定義的相簿:

PHFetchResult *albums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

如果二者都要,則要分別獲取以上兩類相簿,再分別遍歷; 2.遍歷相簿裡的資源,即圖片或視訊

for (PHAssetCollection *collection in smartAlbums) {
        //遍歷獲取相簿
        if ([collection numberOfAssets] > 0) {
            //獲取當前相簿裡所有的PHAsset,也就是圖片或者視訊
            PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:nil];
            for (NSInteger j = 0; j < fetchResult.count; j++) {
                //從相簿中取出照片
                asset = fetchResult[j];
                if (asset.mediaType == PHAssetMediaTypeImage) {
                   //得到一個圖片型別資源
                }else if (asset.mediaType == PHAssetMediaTypeVideo) {
                    //得到一個視訊型別資源
                }else if (asset.mediaType == PHAssetMediaTypeAudio) {
                      //音訊,PHAsset的mediaType屬性有三個列舉值,筆者對PHAssetMediaTypeAudio暫時沒有進行處理
               }
            } 
          }
      }

第三步.遍歷媒體庫中的視訊和音訊

1.遍歷媒體庫中的音訊;媒體庫中的音訊一般為音樂,可以獲取專輯列表,也可以獲取音訊列表,下面獲取的是音訊列表,

- (void)browseMPMediaAudio
{
    NSArray *collections = [[MPMediaQuery songsQuery] collections];
    NSMutableArray *musics = [NSMutableArray array];
    for (MPMediaItemCollection *collection in collections)
    {
       //每個collection是一個專輯,專輯裡包含若干個音訊
        for (MPMediaItem *item in [collection items])
        {
             //每個item就是一個音訊
        }
    }
}

2.遍歷媒體庫中的視訊,

- (void)browseMPMediaVideo:(void(^)(NSArray <HLLocalInfo *> *))videoBlock
{
    MPMediaPropertyPredicate *filterPre = [MPMediaPropertyPredicate predicateWithValue:[NSNumber    numberWithInt:MPMediaTypeAnyVideo] forProperty:MPMediaItemPropertyMediaType];
    MPMediaQuery *query = [[MPMediaQuery alloc] init];
    [query addFilterPredicate:filterPre];
    
    NSMutableArray *temp = [NSMutableArray arrayWithCapacity:0];
    for (MPMediaItem *item in [query items])
    {
        //每個item就是一個視訊
    }
}

通過以上三步,便可以獲取到iOS裝置本地儲存的圖片、音訊、視訊。在獲取成功之後,便需要展示這些資源了。

二、展示圖片,播放音訊和視訊

1.相簿裡的圖片、視訊 注意:有的iPhone使用者會將相簿裡的檔案備份到iCloud上(可以在“設定”裡檢視“使用iCloud的應用“,”照片“開關是否開啟),這時要想獲取圖片檔案或播放視訊,就需要通過網路從iCloud上拉取,程式碼裡的networkAccessAllowed一定要設定為YES

獲取圖片和視訊的縮圖都可以用下面的方法

 PHImageRequestOptions *opt = [[PHImageRequestOptions alloc]init];
            opt.networkAccessAllowed = YES;
            opt.resizeMode = PHImageRequestOptionsResizeModeExact;
           //targetSize可以設定為你想要的大小
            [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:imageSize contentMode:PHImageContentModeDefault options:opt resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
              //如果沒寫opt.networkAccessAllowed = YES;,這裡得到的result==nil
            }];

播放相簿裡的視訊使用AVPlayer即可,播放之前要先獲取視訊,networkAccessAllowed 也要設定為YES

 PHVideoRequestOptions *option = [[PHVideoRequestOptions alloc] init];
    option.networkAccessAllowed = YES;
    option.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if (progressHandler) {
                progressHandler(progress, error, stop, info);
            }
        });
    };
    [[PHImageManager defaultManager] requestPlayerItemForVideo:asset options:option resultHandler:^(AVPlayerItem *playerItem, NSDictionary *info) {
        //獲取到的可以用於播放的視訊playerItem
    }];

2.播放媒體庫裡的視訊和音訊 播放媒體庫的視訊和視訊,可以通過獲取MPMediaItem物件的地址,再用AVPlayer播放

 NSString* filePath = [[mediaItem valueForProperty:MPMediaItemPropertyAssetURL] absoluteString];

注意:以上獲取資源的過程都應放在子執行緒操作