Android实现Live Photos 加源代码
在Android手机上实现类似于iphone中的LivePhoto的功能
源代码分享
github:https://github.com/amazingyyc/DeepRed
代码说明:
1.改变视频的分辨率:修改com.deepcolor.deepred.shot.CameraInstance中的MIN_PREVIEW_WIDTH的值,MIN_PREVIEW_WIDTH越大视频分辨率越大。
2.改变视频bit率:修改jni/encoder.cpp下的int Encoder::get_bit_rate_by_height(int height)函数
3.改变视频帧率:修改jni/content.h中的VIDEO_FPS值
3.改变音频bit率:修改jni/content.h下的AUDIO_BIT_RATE值
4.改变视频长度:修改jni/content.h下的TIME_DURATION和com.deepcolor.deepred.shot.ShotInstance中的ADD_SECOND_PART_MSG_DELAY_TIME的值
5.改变视频存储位置:修改com.deepcolor.deepred.util.FileUtil下的getAppPath()函数
Demo
当点击”拍摄按钮“同时按下鼠标点击秒表”启动“,可以看到同时记录的大约前后1.5s的视频

界面:
1:中间“黄色摄像机”图标:是否开启livephoto功能
2:“闪电图标”:对焦模式
3:左右滑动切换前后摄像头

原理:
1:在jni层保持2个队列,分别存储1.5s的视频和音频数据。视频数据直接调用系统自带的回调函数onPreviewFrame(byte[] data, Camera camera) 的到每一帧的视频数据。
音频新建一个线程循环的从AudioRecord读取音频数据。当数据超过1.5s时就弹出队前数据,然后在加入。
2:当点击拍摄按钮的时候
a:新建一个线程,将当前队列中的视频&音频数据拷贝到线程中,并同时开始使用FFmpeg将数据编码成mp4视频文件
b:同时发送一个1.5s的“延迟消息”,当主线程收到“延迟消息”时,再将当前的队列中的数据拷贝到对应的线程中。
3:直到所有的数据都编码到文件中,结束

问题:
1:慢!慢!慢!,非常的慢。编码3s的1080*760的视频总共45帧,需要16s左右!! 640*480也大约需要5s,没有办法做到实时的拍摄。
原因是使用FFmpeg纯软件编码速度自然很慢,解决办法可以使用Android自带的硬件编码接口MediaCodec代替FFmpeg进行视频编码,手机对MediaCodec支持有问题没办法测试。
2:源代码按键的同时拍摄一段“小视频”,没进行图片的拍摄,调用系统接口即可实现,太懒了不想做了。。。。修改的地方在:com.deepcolor.deepred.sho.ShotInstance中的
takePicture()函数。
3:视频播放的高斯模糊没实现,要实现高斯模糊可以参考前后摄像头的切换效果,代码在com.deepcolor.deepred.view.CameraView中。
Android实现Live Photos 加源代码的更多相关文章
- Android 命名规范 (提高代码可以读性)
android文件众多,根据名称来辨别用途很重要,因此命名要规范 这篇文章可参考:Android 命名规范 (提高代码可以读性) 刚接触android的时候,命名都是按照拼音来,所以有的时候想看懂命名 ...
- Android Stduio统计项目的代码行数
android studio统计项目的代码行数的步骤如下: 1)按住Ctrl+Shift+A,在弹出的框输入‘find’,然后选择Find in Path.(或者使用快捷键Ctrl+Shift+F) ...
- Xamarin.Android提示aapt退出,代码为255
Xamarin.Android提示aapt退出,代码为255 错误信息:”aapt.exe”已退出,代码为255.出现这种问题,通常是由于该项目所使用Android SDK不完整.通过SDK Mana ...
- 【转】【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏
转自:http://mrfufufu.github.io/android/2015/07/01/Codelab_Android_Design_Support_Library.html [翻]Andro ...
- Android JUnit Test——批量运行测试代码
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ Android测试三要素 写Android测试用例有三要素,一是我们用的“安卓模拟器device” ...
- Android WebView中的JavaScript代码使用
在WebView中使用JavaScript 如果你想要载入的页面中用了JavaScript,你必须为你的WebView使能JavaScript. 一旦使能之后,你也可以自己创建接口在你的应用和Java ...
- Android清除本地数据缓存代码案例
Android清除本地数据缓存代码案例 直接上代码: /* * 文 件 名: DataCleanManager.java * 描 述: 主要功能有清除内/外缓存,清除数据库,清除shar ...
- Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏
原文:Codelab for Android Design Support Library used in I/O Rewind Bangkok session--Make your app fanc ...
- 使用Android Studio向GitHub提交代码
使用Android Studio向GitHub提交代码 在GitHub上创建一个仓库 填写仓库名称.描述.类型(公有.私有)等信息,点击创建 到此,成功创建了我们的仓库,并且初始化创建了README. ...
随机推荐
- USB枚举详细过程剖析(转)
USB枚举详细过程剖析(转) 原文地址:http://blog.163.com/luge_arm/blog/static/6774972620071018117290/ 从驱动开发网看到一篇<U ...
- 使用css框架的优缺点
使用css框架的优点 1.加速开发 CSS框架提供通用的代码(如reset,和移动端开发的一些常用设置)和许多丰富的UI组件样式——因此我们不需要从头开始写. 2.无兼容性烦恼 CSS框架解决了各个浏 ...
- python3 urllib.request.urlopen() 地址打开错误
错误内容:UnicodeEncodeError: 'ascii' codec can't encode characters in position 28-29: ordinal not in ran ...
- startActivity与startActivityForResult的使用小结
1.在一个Activity中想要启动进入另一个Activity时,通常我们使用startActivity这个方法来实现,代码如下: 其中MainActivity为源activity,ActivityL ...
- python StringIO标准库基础学习
#标准库:StringIO提供类文件API文本缓冲区#作用:可以处理内存中的文本,有2种不同的实现:cStringIP版本用c编写提高速度,StringIO用python来提供可移植性,与其他字符串连 ...
- iOS 部分问题总结2 - 苹果审核篇
iOS 部分问题总结(二) - 苹果审核篇 1. 记录下5.1新规后上传被拒的问题排查和解决过程. 几天前,最新一次的更新被拒了,提示Invaild Binary.好在苹果同时发来了说明邮件做了详细说 ...
- J2EE基础总结(1)——J2EE入门
J2EE诞生的背景 在传统的开发模式(单层应用结构)下.应用普遍存在下面致命缺点: - 数据.页面和业务逻辑在一个逻辑层次中.功能紧密耦合. - 代码重用性极低,可维护性差. - 应用耦合度高,全然没 ...
- React 入门最好的实例-TodoList
React 的核心思想是:封装组件,各个组件维护自己的状态和 UI,当状态变更,自动重新渲染整个组件. 最近前端界闹的沸沸扬扬的技术当属react了,加上项目需要等等原因,自己也决定花些时间来好好认识 ...
- Gstreamer 中的playback插件
1. PLAYBACK插件基本介绍 在早期的版本中同时存在playbin和playbin2,但是在最新的版本中,playbin2已经稳定,取代了playbin, playbin不再进行维护.下面是官网 ...
- [ASP.NET] 檔案讀寫權限問題
今天遇到一個問題,環境如下: IIS Server: Server 2008 R2 沒加域 File Server: Server 2003 加域 當我的Web程序需要把位於File Server的一 ...