博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios系统相册中视频的获取和另存
阅读量:6313 次
发布时间:2019-06-22

本文共 5147 字,大约阅读时间需要 17 分钟。

hot3.png

一、简介

获取系统相册中数据重要的四个类,他们的关系如下:

ALAssetsLibrary -> ALAssetsGroup -> ALAsset -> ALAssetRepresentation

a、ALAssetsLibrary

初始化一个ALAssetsLibrary对象,我们可以读取所有相关数据,也就是能访问到相册列表了。

b、ALAssetsGroup

我们在访问系统相册,基本上都是使用的遍历的形式得到我们所需。当我们初始化好ALAssetsLibrary对象后,设置遍历类型为ALAssetsGroupAll时,这个过程中我们可以拿到对应相册列表的信息,比如相册列表的名字等。

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];   //生成整个photolibrary实例//在此遍历的是所有的东西[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotos usingBlock:^(ALAssetsGroup *group, BOOL *stop)

当使用ALAssetsGroupSavedPhotos方式对系统相册进行遍历是,打印group并没有获取到对应的分组信息。但使用ALAssetsGroupAll遍历时能得到相册列表的名称。所以遍历方式不一样,会影响到ALAssetsGroup中的相关属性的值。

当其对ALAsset操作时,可以设置许多的东西:

三种遍历方式//按顺便遍历获取相册中所有的资源enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) //可以指定顺序遍历所有资源 ,并指定资源                       enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:0] options:NSEnumerationConcurrent usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {//遍历所有的资源,遍历顺序可以是先序或倒序enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) { 筛选,在此可以指定我们想要的媒体类型文件– setAssetsFilter:  筛选器– numberOfAssets  返回个数,但如果是删选条件下,则返回筛选剩余组的一些属性信息– valueForProperty:(通过组属性名称,获取组属性:组名称,组类型,组永久性ID,组URL)– posterImage(组的封面)– addAsset:

c、ALAsset

 

拿到对应的组ALAssetsGroup对象以后,它里面可能包含多个ALAsset对象,通过它可以得到以下东西:

 

ALAssetPropertyAssetURL 文件的url ALAssetPropertyType       那种类型的文件ALAssetPropertyLocation 资源地理位置(无位置信息返回null)ALAssetPropertyDuation 时长ALAssetPropertyOrientation 8个方向方向ALAssetPropertyDate 精确到秒的拍摄时间ALAssetPropertyURLs  一个字典,键值分别是文件名和文件的url路径editable  property   能否编辑originalAsset  property 原始资源

d、ALAssetRepresentation

从ALAssetRepresentation可以拿到一些具体的信息,比如照片的缩略图,原始图,URL,Size,方向、名字。

//得到相册中的视频文件的url- (void)getImageAndVidoeFormLibrary {        ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];   //生成整个photolibrary实例        __block NSInteger v=0;    __block NSInteger p;    __block NSInteger g=0;    self.imageMA = [NSMutableArray array];    self.imageForViduo = [NSMutableArray array];    NSMutableArray *assetURLDictionaries = [NSMutableArray array];    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {                NSLog(@"ALAssetsGroupSavedPhotos===%@",group);        NSString* groupname = [group valueForProperty:ALAssetsGroupPropertyName];        NSLog(@"groupname--%@",groupname);        //对组进行遍历,筛选分类        [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {                        NSString* type = [result valueForProperty:ALAssetPropertyType];                                    if ([type isEqualToString:ALAssetTypePhoto]) {                      //图片            }else if([type isEqualToString:ALAssetTypeVideo]){                             //保存视频URL                NSLog(@"ALAssetTypeVideo-----%ld",++v);                ALAssetRepresentation *representation = [result defaultRepresentation];                NSURL *url = [representation url];                NSLog(@"%@",url);                [self.imageMA addObject:url];                [self generateIamgeForViodeWithURL:url];                                //下面注释是一个获取到视频并将其写入指定位置方法                //                    long long size = representation.size;                //                    NSMutableData* data = [[NSMutableData alloc] initWithCapacity:size];                //                    void* buffer = [data mutableBytes];                //                    [representation getBytes:buffer fromOffset:0 length:size error:nil];                //                    NSData *fileData = [[NSData alloc] initWithBytes:buffer length:size];                //                //                //                NSDate *  senddate=[NSDate date];                //                //                NSDateFormatter  *dateformatter=[[NSDateFormatter alloc] init];                //                //                [dateformatter setDateFormat:@"YYYYMMdd"];                //                //                NSString *  locationString=[dateformatter stringFromDate:senddate];                //                //                    //File URL                //                    NSString *savePath = [NSString stringWithFormat:@"%@%@", [NSHomeDirectory() stringByAppendingString:[NSString stringWithFormat:@"%@",locationString]], representation.filename];                //                    [[NSFileManager defaultManager] removeItemAtPath:savePath error:nil];                //                //                                //                                //                    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)   {                //                        [fileData writeToFile:savePath atomically:NO];                //                                        //                    });            }else if([type isEqualToString:ALAssetTypeUnknown]){                                NSLog(@"Unknow AssetType");            }        }];    } failureBlock:^(NSError *error) {        NSLog(@"Enumerate the asset groups failed.");    }];    }

 

转载于:https://my.oschina.net/zhengjianhua/blog/694198

你可能感兴趣的文章
Visual Studio 15.4发布,新增多平台支持
查看>>
有赞透明多级缓存解决方案(TMC)设计思路
查看>>
如何设计高扩展的在线网页制作平台
查看>>
Git 2.5增加了工作树、改进了三角工作流、性能等诸多方面
查看>>
Swift 5将强制执行内存独占访问
查看>>
中台之上(二):为什么业务架构存在20多年,技术人员还觉得它有点虚?
查看>>
深度揭秘腾讯云低功耗广域物联网LPWAN 技术及应用
查看>>
与Jeff Sutherland谈敏捷领导力
查看>>
More than React(四)HTML也可以静态编译?
查看>>
React Native最佳学习模版- F8 App开源了
查看>>
云服务正在吞噬世界!
查看>>
阅读Android源码的一些姿势
查看>>
Web语义化标准解读
查看>>
一份代码构建移动、桌面、Web全平台应用
查看>>
高性能 Lua 技巧(译)
查看>>
区分指针、变量名、指针所指向的内存
查看>>
异步编程的世界
查看>>
最近话题火爆的四件事你知道不?
查看>>
SpringBoot整合MyBatis
查看>>
云计算产业如何率先推行信用管理?
查看>>