Livephoto的使用

Livephoto的使用

前言


Live Photo是iPhone的一个新特性,是一段长3秒还包含声音的小视频加一张照片的组合。我们公司是做私有云存储的相关功能,需要支持线上Live Photo的查看和播放,所以今天就来探究下Live Photo的展现和保存。

本地获取


从本地获取LivePhoto主要有以下3种情况:

  • 使用照片选择器UIImagePickerController直接获取
  • 获取照片的资源文件PHAsset再转化成Live Photo
  • 从本地沙盒或者main bundle获取

下面就分别来讲讲这几种情况如何展示Live Photo

使用UIImagePickerController展示

首先需要加入 两个库。
然后生成一个UIImagePickerController,从照片库中选中livePhoto照片。

在回调函数- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)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

你可能感兴趣的:(Livephoto的使用)