iOS通过PHAsset/MediaPlayer获取本地照片、视频、音频学习总结

得闲记录并回顾一下本地资源获取方式,有不正确的地方,还望指正。

背景介绍

需求:获取并展示iOS设备内存储的图片、音频、视频
环境:Xcode10
库:PHPhotos.h,MediaPlayer

说明:设备内图片来自于相册,视频来自于相册和媒体库,音频来于自媒体库。

头文件引用:

#import 

一、获取本地图片、音频、视频

第一步:判断相册权限,遍历相册资源

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  *))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];

注意:以上获取资源的过程都应放在子线程操作

你可能感兴趣的:(iOS)