美文网首页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