Livephoto的使用
前言
Live Photo是iPhone的一个新特性,是一段长3秒还包含声音的小视频加一张照片的组合。我们公司是做私有云存储的相关功能,需要支持线上Live Photo的查看和播放,所以今天就来探究下Live Photo的展现和保存。
本地获取
从本地获取LivePhoto主要有以下3种情况:
- 使用照片选择器
UIImagePickerController
直接获取 - 获取照片的资源文件PHAsset再转化成Live Photo
- 从本地沙盒或者main bundle获取
下面就分别来讲讲这几种情况如何展示Live Photo
使用UIImagePickerController展示
首先需要加入<PhotosUI/PhotosUI.h> <MobileCoreServices/MobileCoreServices.h> 两个库。
然后生成一个UIImagePickerController,从照片库中选中livePhoto照片。
在回调函数- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
中,如果选中的是livePhoto,info中会带有一个PHLivePhoto
对象,我们可以简单的根据是否含有PHLivePhoto
对象来判断选中的是否为livePhoto照片。
livePhoto的展示和播放可以采用系统自带的PHLivePhotoView视图展示,只要将PHLivePhotoView.PHLivePhoto赋值即可,与UIImageView类似。该视图默认支持长按播放功能。主动播放可以调用- (void)startPlaybackWithStyle:(PHLivePhotoViewPlaybackStyle)playbackStyle;
方法,可以通过PHLivePhotoViewDelegate协议监听播放状态。
核心代码:
liveLocal1.PNG
从PHAsset转化成livePhoto
很多时候我们都是使用自定义相册而不是使用UIImagePickerController,因此获取的图片都是通过PHAsset资源文件去获取。下面就来看看PHAsset如何取出livePhoto。
PHAsset有一个mediaSubtypes属性,如果它的值是PHAssetMediaSubtypePhotoLive
那么这张图片就是livePhoto,我们可以通过这个方法过滤出相册中的livePhoto。然后使用PHImageManager的requestLivePhotoForAsset:targetSize:contentMode:options:resultHandler:
方法就能取出对应的livePhoto,显示还是使用PHLivePhotoView来显示。
这里需要注意的是,targetSize是需要展示的图片大小,如果希望取出的是原图,那么可以使用CGSizeMake(asset.pixelWidth, asset.pixelHeight),size太小会导致图片模糊,但是视频播放不影响。
核心代码:
local2.PNG
从沙盒中或者main bundle中获取livePhoto
图片资源存在本地沙盒中一般是.png或者.jpg。livePhoto就比较特殊,是一张图片加一个mov视频,并且该图片和视频必须来自同一张livePhoto。
从沙盒或者bundle中展示LivePhoto需要分别获取视频和图片的RUL地址,然后调用PHLivePhoto中的requestLivePhotoWithResourceFileURLs:placeholderImage:targetSize:contentMode:resultHandler:
方法去获取。
这里需要注意的是,url必须以文件类型结尾,明确告诉系统是视频文件还是图片文件,否则会报资源文件路径错误。
核心代码:
local3.PNG
从网络上下载播放livePhoto
公司的项目类似于云存储,所以把LivePhoto存储在云端也核心需求,所以需要支持云端的livePhoto查看和播放。因为livePhoto的实质其实是一张图片加mov视频,所以可以简单的使用视频播放器添加一个长按播放功能实现。该方法适合安卓端实现。既然iOS系统自带livePhotoView,为何不好好利用一下呢?因此,我采用从网络下载到本地,再使用沙盒展示的方式播放。
我们都知道SDWebImage支持本地缓存,以达到节省流量的目的。livePhoto涉及到视频,为了达到同样的效果,我们也需要对视频进行缓存,流程图如下:
绘图1.jpg这里还需要注意控制缓存的大小,可以像SDWebImage一样,在后台添加定时线程,设置缓存的大小和缓存的个数,当超过阈值的时候自动清空。在cell切换的时候也需要停止上一个正在下载的livePhoto,以达到更快加载当前视图的目的。
livePhoto保存到相册
最后,我们再来说说怎么把livePhoto保存到相册。思路很简单,无论是本地还是网络上的livePhoto都先保存到本地,然后获取本地的文件URL,最后通过PHPhotoLibrary的performChanges:completionHandler:
方法保存到本地相册。
核心函数:
saveToLocal.png
demo地址
demo:LivePhotoTest
网友评论