在Android上山寨了一个Ios9的LivePhotos,放Github上了
9月10号的凌晨上演了一场IT界的春晚,相信很多果粉(恩,如果你指坚果,那我也没办法了,是在下输了)都熬夜看了吧,看完打算去医院割肾了吧。在发布会上发布了游戏机 Apple TV,更大的砧板 Ipad Pro ,鼠标右键 3D Touch,筷子 Apple Pencil,大妈金的肾6s和肾6sp,等等,当然还有LivePhotos。
先看看IOS的LivePhotos
“我要给你拍照了,别站着不动。”“你说啥?”“我在给你拍照,走两步!”
LivePhotos ——Twitter. not Jony Ive
这个是视频,优酷上的。

LivePhotos就是把你拍照前1.5s和拍照后的1.5s都记录下来了,而且!!而且是1200像素的图片啊!!不是视频不是gif啊!
所以内存变成2GB了?网上说照片的大小只是以前的2倍。网上还说肾6s和肾6sp才支持拍摄,之前的肾都不支持,只支持查看。

更多的我就不知道了,只有等到25号发布了再看看别人发的测评文章了。
再看看Android上山寨的LivePhotos


在第一张gif的计数显示到3到4的时候点击了拍照。程序中是记录了前后3s共计6s的时间。
github上的地址:https://github.com/yydcdut/LivePhotos-android
现在的设计思路(3s内的照片)
- 计算出大概的平均每帧间隔时间,new一个可以缓存1.5s内帧数据的队列;
- 获取Camera的帧数据(YUV格式),加入缓存队列,如果队列满了,弹出第一个,再把最新的加到最后;
- 如果点击拍照了,new一个可以缓存3s帧数据的队列,将之前的1.5s数据加到这个队列中,再缓存拍照后1.5s的数据(但是这样可能会OOM,有待改善);
- 将3s的数据写到数据库中,新开启一个服务进程将这3s数据读取出来解码成JPG图片写到SDCard中;
- 获取中间那张图片,做成一张高斯模糊的照片;
- 当展示Live Photo的时候,自定义一个类,初始化前5张照片(这个5张可自定义数量),当显示第一张的时候去解析第六张图片,当显示第二张的时候去解析第七张图片,一次类推;
踩过的巨坑
- 当时担心OOM就将每帧数据一获取到缓存下来然后马上写到数据库中,然后当点击拍照的时候记录时间,之后去数据库中获取数据做图,但是到后面数据库超级大,而且队里里面还缓存了很多;
- 为了结局数据库大的问题,改为当数据库中存的有3s时间内的帧数据的时候就写一条数据然后删一条数据,发现超级慢,缓存队列大到爆;
- 展示Live Photo的时候以为应该不会出现OOM,就用的帧动画AnimationDrawable,结果小内存的手机就OOM,大内存的没有。
还没做完,还要做的
- 当API小于14的时候就使用SurfaceView + Camera的onPreviewFrame()回调(现在还只做了这个,注意有坑)!
- 当API < 20 && API >= 14的时候使用TextureView + Camera来显示预览,获取每帧的bitmap。
- 当API >= 20的时候使用TextureView + Camera2来显示预览,这样可以将图片的分辨率变大。
- 试试前置摄像头的LivePhotos功能。
- 声音!!!
这篇文章还没完
好吧,东西还没做完,但是觉得在Android还是有一定的可行性的。
这篇博客会时常更新,这里就是华丽的分割线。
博客地址:http://www.cnblogs.com/yydcdut/p/4813406.html
Github地址:https://github.com/yydcdut/LivePhotos-android
华丽的分割线

--------- 9.22 更 -----------
完成了4.X上的获取帧数据,但是还没有结局获取帧数据卡顿的情况,第二是获取到的是bitmap,但是要转成byte[],这一部分速率问题等。
发现一个bug,在bugme的系统上,在2.x的activity上能正常开启Service,而在4.x的activity上却不行。。
我是天王盖地虎的分割线
在Android上山寨了一个Ios9的LivePhotos,放Github上了的更多相关文章
- git操作+一个本地项目推到github上+注意
git init 创建新文件夹,打开,然后执行以创建新的 git 仓库. git config --global user.name "xxx" git config --glob ...
- Git学习笔记-上传一个新的项目到GitHub上
前提: 已有Github账号,已在Github上建立了仓库,已在Github上配置了SSH,已上传过一些项目到Github上 目标: 目前有一个新的项目,需要上传到github上 我的做法记录: 1. ...
- [Git]使用Git上传本地项目,并同步到Github上
第一步:先要在github.com中创建一个仓库(New Repository). 第二步,打开Git Bash ① git init [+仓库名]:初始化仓库,执行之后可以在指定的仓库存放地上面看到 ...
- 在windows上传一个新的项目到GitHub上
不多说,直接上步骤 1,新建GitHub的账号密码. 2,新建一个项目 点击new repository 3,选择自己项目,填写格式 点击创建 create repository,这时候一个雏形 ...
- android studio学习----添加项目依赖包补充---添加github上的开源项目为库
导入maven中的库 如果开源库作者有将代码放到Maven库中,我们可以在gradle配置中直接引入,类似如下: compile 'com.github.dmytrodanylyk.android-p ...
- React Native ——实现一个简单的抓取github上的项目数据列表
/** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; var React ...
- 还怕问源码?Github上神级Android三方源码解析手册,已有7.6 KStar
或许对于许多Android开发者来说,所谓的Android工程师的工作"不过就是用XML实现设计师的美术图,用JSON解析服务器的数据,再把数据显示到界面上"就好了,源码什么的,看 ...
- 微软为何选择在 Github 上开源 .NET 核心?
本文来自微软开源.NET 的一篇公告 ,文中阐述了微软为何选择在 Github 开源.NET,以及微软对开源和开源社区方面的认识的变迁. 对于.NET来说,今天(2014/11/12)是个大日子! 我 ...
- Golang优秀开源项目汇总, 10大流行Go语言开源项目, golang 开源项目全集(golang/go/wiki/Projects), GitHub上优秀的Go开源项目
Golang优秀开源项目汇总(持续更新...)我把这个汇总放在github上了, 后面更新也会在github上更新. https://github.com/hackstoic/golang-open- ...
随机推荐
- 二叉查找树(二叉排序树)的详细实现,以及随机平衡二叉查找树Treap的分析与应用
这是一篇两年前写的东西,自我感觉还是相当不错的Treap教程.正好期末信息科学技术概论课要求交一个论文,就把这个东西修改了一下交了,顺便也发到这里吧. 随机平衡二叉查找树Treap的分析与应用 1.序 ...
- BZOJ2217 : [Poi2011]Lollipop
若能得到一个和为t的区间,那么至少去掉两端点中任意一个后必定能得到和为t-2的区间. 所以只需要分别找到和最大的和为奇数和偶数的区间,然后$O(n)$完成构造即可. #include<cstdi ...
- 无法在web服务器上启动调试,iis未列出与打开的URL匹配的网站
错误的原因可能是:在iis的网站上绑定的具体的机器的ip地址. 解决方法:可以在网站上绑定ip地址时选择“全部未分配”项.
- STM32F4 SPI with DMA
STM32F4 SPI with DMA A few people have requested code, so I thought I’d post the code showing how I’ ...
- C#实现路由器断开连接,更改公网ip
publicstaticvoid Disconnect() { string url ="断 线"; string uri ="http://192.168.1.1 ...
- 在ASP.NET MVC中使用Log4Net记录异常日志,出错时导向到静态页
本篇体验在ASP.NET MVC 4中使用Log4Net记录日志. 通过NuGet安装Log4Net. 需求是:当出错时导向到Error.html静态页面,Log4Net记录错误信息. 大致的思路是: ...
- 委托、Lambda表达式、事件系列05,Action委托与闭包
来看使用Action委托的一个实例: static void Main(string[] args) { int i = 0; Action a = () => i++; a(); a(); C ...
- [转]过XX游戏驱动保护的代码
这个是过TX游戏自我保护驱动的源代码.可以过qq堂.DNF.寻仙等QQ游戏. #include <ntddk.h>#include <windef.h>#include < ...
- MySQL递归查询树状表的子节点、父节点具体实现
mysql版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料,写了两个sql存储过程,子节点查询算 ...
- 关于 java,nio,bufferedreader,bytebuffer
有没有一种方法来读取的ByteBuffer有一个BufferedReader,而无需将其转换为String优先?我想读通过一个相当大的 ByteBuffer作为文本行和我想避免它写入磁盘性能方面的原因 ...