• 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中。

  • 相关阅读:
    你不可不知的50个互联网知识
    C算法学习笔记(2)-二叉查找树
    laravel 项目本地版本为5.5,线上mysql 为5.7.21版本,执行严格模式
    mysql中bigint、int、mediumint、smallint与tinyint的取值范围
    Laravel 登录后清空COOKIE 方法
    PHP进阶与redis锁限制并发访问功能示例
    微信开放平台开发——网页微信扫码登录(OAuth2.0)
    一起谈.NET技术,Nhibernate入门与demo 狼人:
    一起谈.NET技术,Siverlight与WCF通信之双工netTcp实现视频对话 狼人:
    一起谈.NET技术,详细述说ADO超时相关问题介绍 狼人:
  • 原文地址:https://www.cnblogs.com/amazingyyc/p/4995539.html
Copyright © 2020-2023  润新知