讲完了这块,我们来说下相机相关的,再说之前一定记得,先要有框架思维,这点一直是我
强调的。
相机是什么,硬件采集数据上来,解析完成,上层绘制,在绘制的时候,同步可以做特效,
而特效的处理方式,可以在底层驱动,也可以在上层 APP。
先知道总体框架,这样子遇到问题,知道它属于哪部分,如何攻克,找代码思考的时候有方
向。然后在学习代码的时候,一定要注意,从已知接口,相关类去深入,利用调试,网络的
分析,汇总成自己的流程图。
下来我们来看下相机预览:
SurfaceView surfaceView;
Camera camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = (SurfaceView) findViewById(R.id.surface_view);
surfaceView.getHolder().addCallback(this);
// 打开摄像头并将展示方向旋转 90 度
camera = Camera.open();
camera.setDisplayOrientation(90);
}
//------ Surface 预览 ------- @Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
try {camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int w, int h)
{
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
camera.release();
}
这里就能够明显的看到,我们在思考问题的时候,一定是利用核心逻辑, 输入–控制–输出。
这个大的框架永远不变。 这里就是 相机硬件采集的数据,进行转化,在界面显示。
而硬件采集上来的数据格式是 NV21 和 YV12 ,安卓默认的格式是 YCbCr_420_SP 的格式
(NV21),格式之间的转化我们用 SDL2.0 库解决,里面写好了各种格式的转化。
默认画布的格式是 ARGB8888 ,32 位的格式。
下来我们又要说一些别的了。数据不做解析说明就是一堆垃圾,无意义的。数据存放读取
出来,是需要按约定的读取方式获取,否则解析出来就是错误的。
所以,文件都是由两部分组成:
很简单,却是很明确,文件头代表什么?算法,文件内容代表数据。各种格式表示后续的数
据该怎么处理,解析。
而音视频中一样,视频格式,音频格式,mp4,wav,都是这里的文件头,表明了后续的文
件内容的读取方式。
解码器支持的格式,就是能够解决几种编码,说到底就是对这些格式进行算法运算,输出
正确的画面,还有声音。