一、从图册中获取本地图片和视频
从图册中获取文件,我们使用的是UIImagePickerController
,这个类我们在之前的摄像头中使用过,这里是链接:iOS学习笔记27-摄像头,这里我们使用的是它的另外一个功能,那就是从图册中获取图片和视频
基本步骤:
- 创建
UIImagePickerController
对象,并设置代理 - 设置拾取源为图册,设置可编辑属性
- 如果只是获取图片,就设置图片的媒体类型,如果只是获取视频,就设置视频的媒体类型,如果两者都要获取,就设置两者的媒体类型(实例采用)
- 弹出图片选择控制器
- 处理图片选择控制器的代理方法
下面是使用实例:
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
#import <AVKit/AVKit.h>
@interface ViewController () <UINavigationControllerDelegate,
UIImagePickerControllerDelegate>
@property (strong, nonatomic) UIImagePickerController *ipc;/* 相册选择器 */
@property (strong, nonatomic) AVPlayerViewController *playerVC;/* 视频播放器 */
@property (weak, nonatomic) IBOutlet UIImageView *showImageView;/* 显示图片 */
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//设置显示图片可交互
self.showImageView.userInteractionEnabled = YES;
//创建AVPlayerViewController控制器
AVPlayerViewController *playerVC = [[AVPlayerViewController alloc] init];
playerVC.view.frame = self.showImageView.bounds;
[self.showImageView addSubview:playerVC.view];
self.playerVC = playerVC;
self.playerVC.view.hidden = YES;
}
#pragma mark - UI点击
/* 点击打开本地相册 */
- (IBAction)pickImage:(id)sender
{
//如果正在播放视频,停止播放
if (self.playerVC.player) {
[self.playerVC.player pause];
}
//创建图片选择控制器
UIImagePickerController *ipc = [[UIImagePickerController alloc] init];
//设置拾取源类型
ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//设置媒体类型,这里设置图册支持的所有媒体类型,图片和视频
ipc.mediaTypes =
[UIImagePickerController availableMediaTypesForSourceType:ipc.sourceType];
ipc.delegate = self;//设置代理
ipc.allowsEditing = YES;//设置可编辑
self.ipc = ipc;
//弹出图片选择控制器
[self presentViewController:ipc animated:YES completion:nil];
}
#pragma mark - UIImagePickerControllerDelegate代理方法
/* 选择了一个图片或者视频后调用 */
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
//获取选择文件的媒体类型
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
NSURL *videoURL = nil;
if ([mediaType isEqualToString:@"public.image"]){//选择了图片
//获取选择的图片
UIImage *selectedImage = [info objectForKey:UIImagePickerControllerOriginalImage];
//显示图片
self.showImageView.image = selectedImage;
self.showImageView.contentMode = UIViewContentModeScaleAspectFill;
NSLog(@"found an image %@",selectedImage);
//删除视频
self.playerVC.player = nil;
self.playerVC.view.hidden = YES;
} else if ([mediaType isEqualToString:@"public.movie"]){//选择了视频
//获取临时保存视频的URL
videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
NSLog(@"found a video %@",videoURL);
//直接创建AVPlayer,它内部也是先创建AVPlayerItem,这个只是快捷方法
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
self.playerVC.player = player;
self.playerVC.view.hidden = NO;
}
[self dismissViewControllerAnimated:YES completion:^{
if (videoURL) {
//调用控制器的属性player的开始播放方法
[self.playerVC.player play];
}
}];
}
/* 取消选择后调用 */
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[self dismissViewControllerAnimated:YES completion:^{
//取消选择后继续播放视频
if (self.playerVC.player) {
[self.playerVC.player play];
}
}];
NSLog(@"取消选择");
}
@end
Demo代码点这里:learnDemo里面的PickerTest
获取视频的时候,会有一个拷贝图册里的视频文件到本地沙盒tmp路径下的过程,需要等待拷贝完成,才会调用代理方法。
这一节属于知识补充,就没有很多新内容,大部分内容之前讲过。