美文网首页
Livephoto的使用

Livephoto的使用

作者: o翻滚的牛宝宝o | 来源:发表于2019-02-25 20:40 被阅读28次

    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

    相关文章

      网友评论

          本文标题:Livephoto的使用

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