1 概述
通过Android Camera拍摄预览中设置setPreviewCallback实现onPreviewFrame接口,实时截取每一帧视频流数据
2 知识点
① Android Camera使用: 参考 Refs/Related 0-4
Camera 支持格式
拍照流程
② Android SurfaceView使用: 参考 Refs/Related 5-10
③ Camera权限
3 核心源码
① SurfaceView相关
// 定义对象
private SurfaceView mSurfaceview = null; // SurfaceView对象:(视图组件)视频显示
private SurfaceHolder mSurfaceHolder = null; // SurfaceHolder对象:(抽象接口)SurfaceView支持类
private Camera mCamera =null; // Camera对象,相机预览
// InitSurfaceView
private void initSurfaceView()
{
mSurfaceview = (SurfaceView) this.findViewById(R.id.Surfaceview);
mSurfaceHolder = mSurfaceview.getHolder(); // 绑定SurfaceView,取得SurfaceHolder对象
mSurfaceHolder.addCallback(mainActivity.this); // SurfaceHolder加入回调接口
// mSurfaceHolder.setFixedSize(176, 144); // 预览大小設置
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 設置顯示器類型,setType必须设置
}
② 主Activity实现SurfaceHolder.Callback接口,编写回调函数
/*【SurfaceHolder.Callback 回调函数】*/
public void surfaceCreated(SurfaceHolder holder)
// SurfaceView启动时/初次实例化,预览界面被创建时,该方法被调用。
{
// TODO Auto-generated method stub
mCamera = Camera.open();// 开启摄像头(2.3版本后支持多摄像头,需传入参数)
try
{
Log.i(TAG, "SurfaceHolder.Callback:surface Created");
mCamera.setPreviewDisplay(mSurfaceHolder);//set the surface to be used for live preview
} catch (Exception ex)
{
if(null != mCamera)
{
mCamera.release();
mCamera = null;
}
Log.i(TAG+"initCamera", ex.getMessage());
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
// 当SurfaceView/预览界面的格式和大小发生改变时,该方法被调用
{
// TODO Auto-generated method stub
Log.i(TAG, "SurfaceHolder.Callback:Surface Changed");
//mPreviewHeight = height;
//mPreviewWidth = width;
initCamera();
}
public void surfaceDestroyed(SurfaceHolder holder)
// SurfaceView销毁时,该方法被调用