美文网首页Android知识程序员Android开发经验谈
Android 自定义相机 视频录制爬过的坑

Android 自定义相机 视频录制爬过的坑

作者: 老去的九零后青年 | 来源:发表于2018-01-30 16:41 被阅读0次

作为一个专业的程序员,怎么能少得了技术的文章呢,诗云:“胸藏文墨怀若谷,腹有诗书气自华”,妥妥的就是一个翻版的我。明明可以靠颜值,非要靠才华。

前言:

近来闲来无事,总结了一下之前做过的经典的小案例,最精彩的莫过于模仿微信的小视频。公司的需求就是要拍一个绕车的小视频,具体的要求就是不超过三十秒 ,视频文件大小限制在20M,必不可少是各个型号的适配。

嘻嘻在这里具体的demo就不往外贴了,下面主要说一下我在这个项目中遇到的难点,其实主要分为三大块 1 是黑屏  2是权限 3是压缩

一.黑屏

场景:运行的时候发现,只有第一次进入时录制界面能成功预览,一旦用back按键返回或者按home键回到主界面,再启动程序的时候,预览界面就变黑了。

定位:黑屏说明surfaceview没有重新绘制。

解决:在界面重新获取焦点的时候要重新绘制,在OnResume()方法中开启一下相机,我是把OnCreate()中的代码挪了过来。在焦点的消失的别忘了在onPause()中关闭相机。如果你认为这样简简单单的就完成那就错了。经过一番测试,在华为 荣耀 三星S6中还是不行,经过一番的查找资料 ,开启相机的时候做一下延迟,调用底层so档的需要时间。我是延迟了50ms;所以最终解决办法还需要将上述OnResume()中的开启相机方法改成如下:

 try {

    Thread.sleep(50);

 } catch (InterruptedException e) {

     // TODO Auto-generated catch block

     e.printStackTrace();

 }   

二.权限

场景:在系统版本5.0以下的手机,手机的权限是自己去申请的,权限拒绝的时候,录制的动画还在走,并且在魅族手机上出现了崩溃。

定位: 得到权限的状态,没有权限的时候禁止操作。

解决:没有使用第三方的状态库,因为项目偏老。而是用了一个比较笨而且实用的方法;针对权限:

/**

*  返回true 表示可以使用  返回false表示不可以使用

*/

public static boolean cameraIsCanUse() {

    boolean isCanUse =true;

    Camera mCamera =null;

    try {

        mCamera = Camera.open();

        Camera.Parameters mParameters = mCamera.getParameters(); //针对魅族手机

         mCamera.setParameters(mParameters);

    }catch (Exception e) {

        isCanUse =false;

    }

    if (mCamera !=null) {

        try {

            mCamera.release();

        }catch (Exception e) {

            e.printStackTrace();

            return isCanUse;

        }

    }

return isCanUse;

}

针对动画的解决方案是根据权限来判断,后来想想了太笨了,根据onTouch事件来做的操作,当权限弹出来的时候,触摸的位置已经改变,但是手指没有抬起。onTouch中有四个状态,分别是1、ACTION_DOWN:表示按下了屏幕,第一个执行也是必然执行的方法。2、ACTION_MOVE:表示为移动手势,会不断的执行直到触摸停止。3、ACTION_UP :表示为离开屏幕,触摸停止的时候执行。4、ACTION_CANCEL:表示取消手势,不会由用户产生,而是由程序产生的。权限的弹出正是由于程序产生的。所以在这个方法中取消动画就可以

三.压缩

场景:开始的时候没有压缩,而且自测的时候把自己写的东西当爹一样的供着,生怕点坏了,测试就不一样了,把你写的东西当成喜当爹得来的孩子,往死了折腾。大部分手机像素都非常高,拍够30秒,视频上传失败。

定位:视频文件过大

解决:在视频录制输出的时候就要压缩,设置视频输出的属性,以此来达到视频压缩的效果,这样会整体的提高视频录制的效率,

// 这里是重点,分辨率和比特率

// 分辨率越大视频大小越大,比特率越大视频越清晰

// 清晰度由比特率决定,视频尺寸和像素量由分辨率决定

// 比特率越高越清晰(前提是分辨率保持不变),分辨率越大视频尺寸越大。

在这里要根据不同的手机来做不同的压缩,不过小米手机我做了特别处理。因为经过大量的测试,只有小米的手机在同样的参数下,压缩出来的视频过大。

一般手机 int y =3*1024*1024;

小米手机 int y =2*动态的宽*动态的高;

嘻嘻到这里就是我遇到的比较奇葩的难点 ,其他的难点网上解决办法一大把。嘻嘻只是给大家提供一下思路 拒绝伸手党。

相关文章

网友评论

    本文标题:Android 自定义相机 视频录制爬过的坑

    本文链接:https://www.haomeiwen.com/subject/itnqzxtx.html