zoukankan      html  css  js  c++  java
  • 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中。

  • 相关阅读:
    小心服务器内存居高不下的元凶WebAPI服务
    注册登录过程点滴(二):使用MVC Remote验证的注意点
    .net framework 4.5为啥在IIS中找不到了
    windows平台下载Android源码
    unix及linux文件锁
    分布式软件系统
    C++ base
    linux目录结构
    linux中pkill的简单用法
    Linux中Kill进程的N种方法
  • 原文地址:https://www.cnblogs.com/amazingyyc/p/4995539.html
Copyright © 2011-2022 走看看