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. ...
随机推荐
- 【C++模版之旅】静态多态的讨论
说到面向对象特性之一“多态”,以我的水平已经说不出太多新意了.相信很多程序员代码K多了,做梦都在“多态中”运行着.常规的多态是C++语义内置支持的一种特性,通过虚函数可以实现这个特性,为了后面以示区别 ...
- C/C++基础概念
1.类占用的内存大小: 1)在不同位数的操作系统下,各种数据类型所占用的内存大小:32位和64位操作系统 http://blog.csdn.net/b_zhang/article/details/68 ...
- Team Queue(多队列技巧处理)
Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- Linux备份
Eking<longpeisky@vip.qq.com> 19:35:17 增量备份是针对于上一次备份(无论是哪种备份):备份上一次备份后,所有发生变化的文件. (增量备份过程中,只备份 ...
- SRM 588 D2 L2:GUMIAndSongsDiv2,冷静思考,好的算法简洁明了
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12707 算法决定一切,这道题目有很多方法解,个人认为这里 ve ...
- 安装MySQL和Navicat,并与MyEclipse连接
1.下载安装MySQL 1)到http://dev.mysql.com/downloads/下载MySQL社区版Server,和用于JDBC的Connector.一路默认安装就可以,须要注意的是记住M ...
- oracle SQL语句练习MERGE、模糊查询、排序、
Oracle支持的SQL指令可分为数据操作语言语句.数据定义语言语句.事务控制语句.会话控制语句等几种类型:1.数据操作语言语句数据操作语言语句(Data manipulation language, ...
- VSIM生成fsdb波形文件(VERILOG)
VSIM生成fsdb波形文件(verilog) 两步主要的设置 testbench加入函数 运行库调用 1.testbench加入函数 initial begin $fsdbDumpfile(&quo ...
- Arcgis Engine - 脱离ToolBarControl控件的命令和工具
可以手动实现脱离ToolBarControl控件的命令和工具 //打开文件. private void file_tsmItem_Click(object sender, EventArgs e) { ...
- WebApi实现跨域功能
在配置文件的system.webServer节点中加入以下配置信息 <httpProtocol> <customHeaders> <add name="Acce ...