本文代碼內(nèi)容適合自定義選擇相冊(cè)文件內(nèi)容, 例如: 多個(gè)圖操作, 多個(gè)視頻操作.
單圖單視頻操作參考
iOS 獲取本地相冊(cè)圖片視頻(一)
代碼思路
1.設(shè)置訪問相機(jī)相冊(cè)權(quán)限
2.引入框架
3.獲取本地相冊(cè)中所有相簿(相機(jī)膠卷和自定義相簿等)
4.獲取對(duì)應(yīng)相簿下的所有文件(照片和視頻等)
5.獲取對(duì)應(yīng)文件的圖片
6.獲取視頻文件信息
詳細(xì)內(nèi)容
1.設(shè)置訪問相機(jī)相冊(cè)權(quán)限
.plist 的添加方式:
添加下面的一項(xiàng),提示文字自定義
Privacy - Photo Library Additions Usage Description
source code的添加方式:
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能訪問相冊(cè)</string>
2.引入框架
#import <AVFoundation/AVCaptureDevice.h>
#import <AVFoundation/AVMediaFormat.h>
#import <Photos/Photos.h>
#import <AssetsLibrary/AssetsLibrary.h>
3.獲取本地相冊(cè)中所有相簿(相機(jī)膠卷和自定義相簿等)
存儲(chǔ)所有相簿的數(shù)組
// 這里創(chuàng)建一個(gè)數(shù)組, 用來存儲(chǔ)所有的相冊(cè)
NSMutableArray *allAlbumArray = [NSMutableArray array];
獲取相機(jī)膠卷相簿并存儲(chǔ)到數(shù)組
// 獲得相機(jī)膠卷
// PHAssetCollectionTypeSmartAlbum = 2, 智能相冊(cè),系統(tǒng)自己分配和歸納的
// PHAssetCollectionSubtypeSmartAlbumUserLibrary = 209, 相機(jī)膠卷
PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
// 相機(jī)膠卷相簿存儲(chǔ)到數(shù)組
[allAlbumArray addObject:cameraRoll];
自定義相簿并存儲(chǔ)到數(shù)組
// 獲得所有的自定義相簿
// PHAssetCollectionTypeAlbum = 1, 相冊(cè),系統(tǒng)外的
// PHAssetCollectionSubtypeAlbumRegular = 2, 在iPhone中自己創(chuàng)建的相冊(cè)
// assetCollections是一個(gè)集合, 存儲(chǔ)自定義的相簿
PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
// 遍歷所有的自定義相簿
for (PHAssetCollection *assetCollection in assetCollections) {
// 相簿存儲(chǔ)到數(shù)組
[allAlbumArray addObject:assetCollection];
}
4.獲取對(duì)應(yīng)相簿下的所有文件(照片和視頻等)
上一步驟我們把所有相簿存儲(chǔ)在數(shù)組(allAlbumArray)里, 這里我們?cè)跀?shù)組(allAlbumArray)里取一個(gè)相簿(albumCollection)作為示例, 獲取相簿albumCollection下的所有文件
取出一個(gè)相簿, 名稱設(shè)置為:albumCollection
// 這里假設(shè)你的本地相簿數(shù)目超過2個(gè), 取出一個(gè)示例相簿為albumCollection
PHAssetCollection *albumCollection = allAlbumArray[1];
NSLog(@"相簿名:%@ 照片個(gè)數(shù):%ld", albumCollection.localizedTitle, albumCollection.count);
獲取相簿(albumCollection)下所有PHAsset對(duì)象并存儲(chǔ)在集合albumAssets中
// 獲得相簿albumCollection中的所有PHAsset對(duì)象并存儲(chǔ)在集合albumAssets中
PHFetchResult<PHAsset *> *albumAssets = [PHAsset fetchAssetsInAssetCollection:albumCollection options:nil];
5.獲取對(duì)應(yīng)文件的圖片
上一步驟我們把相簿(albumCollection)中的所有PHAsset對(duì)象存儲(chǔ)在集合(albumAssets)中, 這里我們獲取集合(albumAssets)中的PHAsset對(duì)象的圖片及其他信息
遍歷集合(albumAssets), 獲取對(duì)應(yīng)文件的圖片及其他信息
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.resizeMode = PHImageRequestOptionsResizeModeFast;
// 同步獲得圖片, 只會(huì)返回1張圖片
options.synchronous = YES;
// 遍歷集合, 并獲取文件圖片及其他信息
for (PHAsset *asset in assets) {
// mediaType文件類型
// PHAssetMediaTypeUnknown = 0, 位置類型
// PHAssetMediaTypeImage = 1, 圖片
// PHAssetMediaTypeVideo = 2, 視頻
// PHAssetMediaTypeAudio = 3, 音頻
int fileType = asset.mediaType;
// 是否要原圖
BOOL original = YES;
CGSize size = original ? CGSizeMake(asset.pixelWidth, asset.pixelHeight) : CGSizeZero;
// 獲取文件圖片
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
// result為文件圖片
// info其他信息
}];
}
6.獲取視頻文件信息
步驟4中我們把相簿(albumCollection)中的所有PHAsset對(duì)象存儲(chǔ)在集合(albumAssets)中, 這里我們?cè)诩?albumAssets)取出一個(gè)視頻PHAsset對(duì)象(videoAsset), 獲取該視頻PHAsset對(duì)象(videoAsset)的文件信息
取出一個(gè)視頻PHAsset對(duì)象(videoAsset)并獲取文件信息
// 取出一個(gè)視頻對(duì)象, 這里假設(shè)albumAssets集合有視頻文件
PHAsset *videoAsset;
for (PHAsset *asset in albumAssets) {
// mediaType文件類型
// PHAssetMediaTypeUnknown = 0, 位置類型
// PHAssetMediaTypeImage = 1, 圖片
// PHAssetMediaTypeVideo = 2, 視頻
// PHAssetMediaTypeAudio = 3, 音頻
int fileType = asset.mediaType;
// 區(qū)分文件類型, 取視頻文件
if (fileType == PHAssetMediaTypeVideo)
{
// 取出視頻文件
videoAsset = asset;
// 取到一個(gè)視頻對(duì)象就不再遍歷, 因?yàn)檫@里我們只需要一個(gè)視頻對(duì)象做示例
return;
}
}
獲取視頻PHAsset對(duì)象(videoAsset)信息
PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
options.version = PHImageRequestOptionsVersionCurrent;
options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;
[[PHImageManager defaultManager]requestAVAssetForVideo:videoAsset options:options resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
// 獲取信息 asset audioMix info
// 上傳視頻時(shí)用到data
AVURLAsset *urlAsset = (AVURLAsset *)asset;
NSData *data = [NSData dataWithContentsOfURL:url];
}];
注意:個(gè)人理解,若有錯(cuò)誤請(qǐng)指正,謝謝!!!