作为一个专业的程序员,怎么能少得了技术的文章呢,诗云:“胸藏文墨怀若谷,腹有诗书气自华”,妥妥的就是一个翻版的我。明明可以靠颜值,非要靠才华。
前言:
近来闲来无事,总结了一下之前做过的经典的小案例,最精彩的莫过于模仿微信的小视频。公司的需求就是要拍一个绕车的小视频,具体的要求就是不超过三十秒 ,视频文件大小限制在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*动态的宽*动态的高;
嘻嘻到这里就是我遇到的比较奇葩的难点 ,其他的难点网上解决办法一大把。嘻嘻只是给大家提供一下思路 拒绝伸手党。