如何在新款iPhone中vue 导入外部jsLive Photo

1319人阅读
事情的经过是这样的:昨晚,一个朋友问我怎么越狱,我说越狱干嘛,他说他想用LivePhoto功能,但是他的手机是iPhone6,没有这个功能,说是越狱后装一个插件就可以。听完后,我说最好不要越狱,虽然可以用一些插件,但是手机里面信息的安全性非常差,说不定别人插件后台开个什么线程你也不知道,就好像你家里装了门,你还在门上开个洞,谁想来都可以。做为一名iOS程序猿,我觉得苹果如今开源性很强,很多功能都是可以实现的。于是,我很装逼的说,
我说你等着,明天上班我给你做一个。
今早一到办公室就开始查资料,说到LivePhoto就不得不提MOV,这两个都是苹果开发的格式,LivePhoto其实就是一个JPG加上一个MOV,只不过这个MOV里面写入了一些元数据,能让相册正确的识别。对应iOS中的框架是ImageIO/MobileCoreServices/Photos/AVFoundation&等。
下面附上资料,文中有很详细的解释,也有Demo地址,相信大家仔细看下就会明白的,毕竟,Talk is cheap, show me the code~
GIF/MOV/Live Photo
这次这篇文章来谈谈&GIF/MOV/Live Photo&两两之间的格式转换,这个需求来自于我最近在做的一个小项目,里面提供了类似的功能。
这三个格式有一个共同点,他们都可以由一个连续的图片序列得到。其中 MOV 和 Live Photo 都是苹果开发的格式,更进一步的讲 Live Photo 其实是一个 JPG 加上一个 MOV,只不过这个 MOV 里面写入了一些元数据,能让相册正确的识别。本文涉及到的核心框架有:ImageIO/MobileCoreServices/Photos/AVFoundation&等。
# GIF -& MOV
顾名思义,将 GIF 文件 decode 成 image array 和 duration array 的过程,通过&ImageIO Framework&去做,当然我这里还是会推荐 ibireme 的&,他已经做了大部分的工作。我们在显示了
imageView 之余可以使用:
- (UIImage *)animatedImageFrameAtIndex:(NSUInteger)index;
- (NSTimeInterval)animatedImageDurationAtIndex:(NSUInteger)index;
这两个代理方法得到图片和时间的数组,接下来就是把它通过 AVFoundation 框架写到一个 MOV 文件里面去。有这么几步:创建 AVAssetWriter 和 AVAssetWriterInput,然后使用 WriterInput 的这个方法:
- (void)requestMediaDataWhenReadyOnQueue:(dispatch_queue_t)queue usingBlock:(void (^)(void))block;
在这个 queue 中遍历 decode 出来的 image 列表,将 image 转换成 CVPixelBufferRef,并将 durations 里面的时间间隔转换成 CMTime,然后写进去:
[self.writerInput requestMediaDataWhenReadyOnQueue:mediaInputQueue usingBlock:^{
CMTime presentationTime = kCMTimeZero;
while (YES) {
if (index &= frameCount) {
if ([self.writerInput isReadyForMoreMediaData]) {
@autoreleasepool {
UIImage *image = images[index];
CVPixelBufferRef buffer = [self newPixelBufferFromCGImage:image.CGImage];
if (buffer) {
double scale = averageScale;
if (index & durations.count) {
scale = 1.0 / [durations[index] doubleValue];
[self.bufferAdapter appendPixelBuffer:buffer withPresentationTime:presentationTime];
presentationTime = CMTimeAdd(presentationTime, CMTimeMake(1, scale));
CVBufferRelease(buffer);
index++;
[self.writerInput markAsFinished];
[self.assetWriter finishWritingWithCompletionHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
self.completionBlock(self.fileURL);
CVPixelBufferPoolRelease(self.bufferAdapter.pixelBufferPool);
这里有个大坑,如果 GIF 文件的长宽不是&16&的整数倍,生成出来的 MOV 文件会有奇奇怪怪的问题,所以在创建 outputSettings 的时候,我使用了下面的方法:
+ (NSDictionary *)videoSettingsWithCodec:(NSString *)codec width:(CGFloat)width height:(CGFloat)height {
int w = (int)((int)(width / 16.0) * 16);
int h = (int)(height * w / width);
NSDictionary *videoSettings = @{
AVVideoCodecKey: codec,
AVVideoWidthKey: @(w),
AVVideoHeightKey: @(h)
return videoSettings;
将分辨率转换到与原分辨率最接近的 16 的整数倍,最后从 fileURL 里面取出生成的结果即可。
# MOV -& GIF
我在上次的文章里面提到过,NSGIF 这个项目提供了一个视频转到 GIF 的例子,但是写的不怎么好,所以这里大致讲一下原理是什么。最核心的概念有两个:使用&AVAssetImageGenerator&取关键帧,以及使用&CGImageDestinationAddImage&等函数往
GIF 文件里面添加帧。这里有一点可以提一下,AVAssetImageGenerator 有两个参数:requestedTimeToleranceBefore 和 requestedTimeToleranceAfter,这两个参数如果都填 kCMTimeZero 的话取出来的帧会精确无比,但同时也会因此而降低性能。同时这个过程中,时间的转换是 GIF -& MOV 的反过程,也即 CMTime 转换成帧与帧的时间间隔:
NSMutableArray *timePoints = [NSMutableArray array];
for (int currentFrame = 0; currentFrame&frameCount; ++currentFrame) {
float seconds = (float)increment * currentFrame + offset;
CMTime time = CMTimeMakeWithSeconds(seconds, [timeInterval intValue]);
[timePoints addObject:[NSValue valueWithCMTime:time]];
通过&CGImageDestinationCreateWithURL&创建 GIF 文件,CGImageDestinationAddImage&添加关键帧,最后&CGImageDestinationSetProperties&和&CGImageDestinationFinalize&来结束文件写入。
# MOV -& Live Photo
这一步可以直接看&&这个代码,基本上看完了也就懂了整个过程(但其实需要对
Live Photo 格式有所了解),这个代码是适用于&iOS 9.1&及以上的系统的,否则即便可以创建也没有&PHLivePhoto&这样的类来提供应用内显示的逻辑。简单说就是需要创建两个文件,一个 JPG 一个 MOV,但是两个文件都写进去了一些元数据,比如说创建 JPG 的时候 CGImageDestinationAddImageFromSource,这里面居然鬼使神差的要写入一个这样的元数据:
metadata[(id)kCGImagePropertyMakerAppleDictionary] = @{@&17&: @&UUID&};
这个东西其实是来自于作者对 Live Photo 文件的 EXIF 信息观察。我尝试用自己写的 app 看了一下任何一个 Live Photo 的 EXIFF:
果不其然这里面有个 17 对应过去是一个能够用来找到 MOV 文件的 UUID 信息。
至于 MOV 文件,元数据就更多更复杂,有一些类似于&com.apple.quicktime.still-image-time&这样的 metadata 在里面,StackOverflow 上面能找到一些描述:
之后我再对 Live Photo 的 MOV 文件进行一个格式的分析。
创建好这两个文件之后,使用&Photos Framework&可以把他们写到相册,使用&PhotosUI Framework&的PHLivePhotoView&可以展示和播放 Live Photo,从而完成了整个过程:
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset];
PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];
[request addResourceWithType:PHAssetResourceTypePairedVideo fileURL:[NSURL fileURLWithPath:outputMOVPath] options:options];
[request addResourceWithType:PHAssetResourceTypePhoto fileURL:[NSURL fileURLWithPath:outputJPEGPath] options:options];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (finishBlock) {
finishBlock(success, error);
# Live Photo -& MOV
根据上面的内容我们已经知道,Live Photo 不用转换到 MOV,它本身就包含一个 MOV,所以我们只要把它取出来,可以有两个方法做这个事情:
合法的方案,使用&PHAssetResourceManager:
[[PHAssetResourceManager defaultManager] writeDataForAssetResource:resource toFile:[NSURL fileURLWithPath:@&&] options:nil completionHandler:^(NSError * _Nullable error) {
这个方法会把 Asset 写到你指定的路径,然后通过路径取出来即可。另外一个方案不太合法,PHAsset 有个叫做&fileURLForVideoComplementFile&的方法,这是个私有的,他可以直接取到上述描述中的 MOV 文件的 URL,甚至还有另外一个叫做&fileURLForVideoPreviewFile能取到预览文件的
URL。至于怎么用的话,我还是不说了罢,反正都有合法的方法了。
# GIF &-& Live Photo
其实 Live Photo 到 GIF 已经不用讲了,通过上述方法拿到 MOV 再跑 MOV -& GIF 的流程即可。
理论上,GIF -& Live Photo 的过程也不太用讲,最笨的方法可以通过&GIF -& MOV -& Live Photo&来实现,这是一定可行的。但是这样有个缺陷就是性能,因为这个过程中相当于做了两次写入视频文件的操作。
我尝试过直接将 GIF decode 之后去写 Live Photo 的视频文件,遗憾的是没有成功,根本原因还是因为 GIF 转视频时候使用的 buffer 和 MOV 转 Live Photo 时候的 buffer 是不同的,是一个 pixel buffer,貌似没办法插入符合 Live Photo 的 metadata,这个我不是特别确定,尚存疑。目前我才用的方法就是做了两次转换,一个正常 5s 以内的视频在 iPhone
6s Plus 上面大概在 2s 以内,也算可以接受。
# 后续的点
后面有两点想做的,首先想完全搞清楚 Live Photo 的文件格式,搞清楚那些 metadata 如何得到的。另外就是想要优化一下 GIF 转换到 Live Photo 的性能,看能不能一步到位。
今天的文章很长,感谢看到这里的朋友,下次再见。
参考项目:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:90121次
积分:1515
积分:1515
排名:千里之外
原创:65篇
转载:29篇
(1)(2)(4)(8)(1)(1)(4)(3)(2)(5)(2)(13)(16)(7)(26)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'您的位置:
→ livephotos怎么用?livephotos导入设置图文教程
livephotos怎么用?livephotos导入设置图文教程[多图]
字体大小:【 |
14:24:33&&&
类型:手机系统大小:166KB评分:5.0平台:标签:
livephotos怎么用?livephotos导入设置图文教程。想必不少朋友已经入手新iphone了吧,livephotos是一个十分酷炫的技能,必须get起来,让我们一起来学习吧!
首先打开手机拍摄LIVE动态照片,多拍些。要替换多少发拍多少张,
然后打开PP助手-文件-系统文件-DCIM/100APPLE
然后看看 你拍照片的文件名是什么,然后复制修改你下载的演示机里的LIVE动态照片
修改好之后导入系统相册替换你之前拍的LIVE
然后打开系统相册慢慢设置吧,这方法有缺陷就是无法修改省略图。。
完美解决省略图不更新
1.删除/DCIM/.THMB所有文件夹(全部为略缩图缓存文件)
(PS我找了半天没找到我就没删除.直接删除第二个然后重启)
2.删除/PhotoData/Photos.sqlite(为了重新加载),删除后点击相机或相册都会闪退。
不要担心,方法就是-----重启手机~~~,然后点开相册,完美加载预览图
以上就是清风小编为大家带来的livephotos导入设置图文教程,更多相关内容敬请关注清风手游网。
更多Live Photos内容,请进入专题:
专题类型:图片类
更新时间:
专题标签:唯美主题美化壁纸
LivePhotos是一款苹果6s及6splus手机独有的现场照片功能软件,该软件只需要用户开启苹果6s及6splus手机的Li...
5.0清风指数
0人0人
Live Photo软件资讯16
Live Photo软件教程6
(您的评论需要经过审核才能显示)
声明:清风手游网未在任何手游交易平台有代充和返利店铺,如有相同名称,非本站行为!请勿上当!Live Photos的这些新特性,你会用吗?
来源:爱思助手
  iOS 11 中苹果对照片 Live Photos 功能进行完善,增加了新的效果,可调整关键照片,裁剪 Live Photo 等。  Live Photos 是在 2015 年随着 iPhone 6s 同步上市的。也许有些用户日常很少会使用到它。可是在 iOS 11 中,随着新特性的增加,特别是关键照片和新效果等特性的出现应该能够改变你对它的看法。iOS 11 在选择关键照片的功能还是可以的,而它支持用户对其进行控制和改变,这可就更有用了。  新的效果包括循环、来回播放或长曝光,习惯使用 Instagram 和 Snapchat 的用户对于这些效果应该不陌生。  下面我们就稍微来看一下新的 Live Photos 如何使用吧。  和 iOS 10 中的一样,点击取景框顶部的黄色圆形即可打开/关闭 Live Photos。你可以在拍摄 live Photo 前就选择好滤镜效果,或者在拍摄之后再选择添加滤镜也可以。拍摄好 Live Photo 之后,点击编辑按键即可开始进行编辑。  拍摄者知道在自己拍摄 Live Photo 的过程中,有某个部分拍摄对象是笑对镜头的,所以他开始调整关键照片。如下图,拖拽白色方框去查看 Live Photo,点击 Make Key Photo 确认变化。和在 iOS 10 中的一样,用户仍可以编辑滤镜效果和水平等。  新的效果在编辑时无法显示。在照片应用中查看 Live Photo 时,向上轻扫即可调出循环、来回播放或长曝光滤镜来选择。更改滤镜效果之后,稍等一会就能够在左上角看到更新后的效果。  你喜欢 Live Photos 吗?你在 iOS 10 中会经常使用它吗?或者你已经忘记了它存在?你对 iOS 11 中 Live Photo 的更新满意吗?iPhone6s/6s Plus福利:关于更简单快捷导入LivePhoto的方法 - 苹果手机技巧大全
iPhone6s/6s Plus福利:关于更简单快捷导入LivePhoto的方法
果粉查询,你身边的神器!
需要材料如下:一台电脑 iPhone6s 数据线 任何可以管理手机文件的助手(本教程使用工具:iTools)
1、首先按照惯例 随便拍一张LivePhoto
2、然后连接手机至电脑 打开iTools 在文件管理中 进入用户系统 然后进入DCIM 再进入XXXAPPLE(数字随机 也可能有多个 请找最大那个)。紧接着找到刚刚拍的照片,复制出文件名。
3、然后打开下载好的导入文件 改名
4、随后拖入刚刚在iTools中的文件夹,选择覆盖
随后关键的一步来了 打开手机 记住不用清理照片缓存 直接打开手机 这是本教程和其他教程完全不一样的地方
5、打开相册,我们可以看到刚刚拍的那张照片,缩略图仍然是我们拍的图片,可打开之后是我们导入的图片。
6、这时候按编辑,然后按下方第二个调整大小
随便调整一下大小或者角度然后按完成
这时候我们回到缩略图看发现缩略图已经正常显示了,可照片不会动了。不要担心,关键的一步来了:我们再次进入照片,按编辑,随后点右下角复原然后确定,返回相册再次打开照片,是不是会动了呢?
结束
原理其实很简单,就是通过iPhone本身的编辑重建缩略图,如果你并没有那种强迫症 请忽略本教程后半部分,因为导入就可以用了。
微信扫一扫关注果粉查询公众号iPhone6s怎么导入Live Photos_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
iPhone6s怎么导入Live Photos
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 导入外部磁盘 的文章

 

随机推荐