iOS通過PHAsset/MediaPlayer獲取本地照片、視訊、音訊學習總結
阿新 • • 發佈:2018-12-15
得閒記錄並回顧一下本地資源獲取方式,有不正確的地方,還望指正。
背景介紹
需求:獲取並展示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];
注意:以上獲取資源的過程都應放在子執行緒操作