美文网首页
获取本地视频&&图像

获取本地视频&&图像

作者: 小破孩_小翟 | 来源:发表于2015-12-15 18:48 被阅读0次

    // 照片原图路径

    #define KOriginalPhotoImagePath [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"OriginalPhotoImages"]

    // 视频URL路径

    #define KVideoUrlPath [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@VideoURL]

    // caches路径

    #define KCachesPath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0]

    //获取手机video  and  image

    - (void)getVideoAndImage

    {

    __weak typeof(self) weakSelf = self;

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) {

    if (group != nil) {

    [weakSelf.groupArrays addObject:group];

    } else {

    [weakSelf.groupArrays enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

    [obj enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {

    if ([result thumbnail] != nil) {

    // 照片

    if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]){

    NSDate *date= [result valueForProperty:ALAssetPropertyDate];

    UIImage *image = [UIImage imageWithCGImage:[result thumbnail]];

    NSString *fileName = [[result defaultRepresentation] filename];

    NSURL *url = [[result defaultRepresentation] url];

    int64_t fileSize = [[result defaultRepresentation] size];

    NSLog(@"date = %@",date);

    NSLog(@"fileName = %@",fileName);

    NSLog(@"url = %@",url);

    NSLog(@"fileSize = %lld",fileSize);

    // UI的更新记得放在主线程,要不然等子线程排队过来都不知道什么年代了,会很慢的

    dispatch_async(dispatch_get_main_queue(), ^{

    self.litimgView.image = image;

    });

    }

    // 视频

    else if ([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo] ){

    NSDate *date= [result valueForProperty:ALAssetPropertyDate];

    UIImage *image = [UIImage imageWithCGImage:[result thumbnail]];

    NSString *fileName = [[result defaultRepresentation] filename];

    NSURL *url = [[result defaultRepresentation] url];

    int64_t fileSize = [[result defaultRepresentation] size];

    self.urlString = url;

    NSLog(@"video----date = %@",date);

    NSLog(@"video----fileName = %@",fileName);

    NSLog(@"video----url = %@",url);

    NSLog(@"video----fileSize = %lld",fileSize);

    // 和图片方法类似

    dispatch_async(dispatch_get_main_queue(), ^{

    self.litimgView.image = image;

    });

    }

    }

    }];

    }];

    }

    };

    ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error){

    NSString *errorMessage = nil;

    switch ([error code]) {

    case ALAssetsLibraryAccessUserDeniedError:

    case ALAssetsLibraryAccessGloballyDeniedError:

    errorMessage = @"用户拒绝访问相册,请在<隐私>中开启";

    break;

    default:

    errorMessage = @"Reason unknown.";

    break;

    }

    dispatch_async(dispatch_get_main_queue(), ^{

    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"错误,无法访问!" message:errorMessage delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

    [alertView show];

    });

    };

    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]  init];

    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll

    usingBlock:listGroupBlock failureBlock:failureBlock];

    });

    }

    // 将原始图片的URL转化为NSData数据,写入沙盒

    - (void)imageWithUrl:(NSURL *)url withFileName:(NSString *)fileName

    {

    // 进这个方法的时候也应该加判断,如果已经转化了的就不要调用这个方法了

    // 如何判断已经转化了,通过是否存在文件路径

    ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];

    // 创建存放原始图的文件夹--->OriginalPhotoImages

    NSFileManager * fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath:KOriginalPhotoImagePath]) {

    [fileManager createDirectoryAtPath:KOriginalPhotoImagePath withIntermediateDirectories:YES attributes:nil error:nil];

    }

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    if (url) {

    // 主要方法

    [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {

    ALAssetRepresentation *rep = [asset defaultRepresentation];

    Byte *buffer = (Byte*)malloc((unsigned long)rep.size);

    NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:((unsigned long)rep.size) error:nil];

    NSData *data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];

    NSString * imagePath = [KOriginalPhotoImagePath stringByAppendingPathComponent:fileName];

    [data writeToFile:imagePath atomically:YES];

    } failureBlock:nil];

    }

    });

    }

    // 将原始视频的URL转化为NSData数据,写入沙盒

    - (void)videoWithUrl:(NSURL *)url withFileName:(NSString *)fileName

    {

    // 解析一下,为什么视频不像图片一样一次性开辟本身大小的内存写入?

    // 想想,如果1个视频有1G多,难道直接开辟1G多的空间大小来写?

    ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    if (url) {

    [assetLibrary assetForURL:url resultBlock:^(ALAsset *asset) {

    ALAssetRepresentation *rep = [asset defaultRepresentation];

    NSString * videoPath = [KCachesPath stringByAppendingPathComponent:fileName];

    char const *cvideoPath = [videoPath UTF8String];

    FILE *file = fopen(cvideoPath, "a+");

    if (file) {

    const int bufferSize = 1024 * 1024;

    // 初始化一个1M的buffer

    Byte *buffer = (Byte*)malloc(bufferSize);

    NSUInteger read = 0, offset = 0, written = 0;

    NSError* err = nil;

    if (rep.size != 0)

    {

    do {

    read = [rep getBytes:buffer fromOffset:offset length:bufferSize error:&err];

    written = fwrite(buffer, sizeof(char), read, file);

    offset += read;

    } while (read != 0 && !err);//没到结尾,没出错,ok继续

    }

    // 释放缓冲区,关闭文件

    free(buffer);

    buffer = NULL;

    fclose(file);

    file = NULL;

    }

    } failureBlock:nil];

    }

    });

    }

    相关文章

      网友评论

          本文标题:获取本地视频&&图像

          本文链接:https://www.haomeiwen.com/subject/irlehttx.html