Android视频录制从不入门到入门系列教程(二)————显示视频图像
1、创建一个空的工程,注意声明下列权限:
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2、布局文件
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/surfaceView" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout>
很简单,就放了一个SurfaceView用来显示视频图像。
3、初始化摄像头
private void initCamera() { camera = Camera.open(); }
通过Camera的open方法开启摄像头,open方法还有一个重载方法,主要用于告诉系统我要打开哪个摄像头,现在手机一般都是两个摄像头以上。默认打开的是后置摄像头。
4、释放摄像头
private void releaseCamera() { if (camera != null) { // 释放前先停止预览 camera.setPreviewCallback(null); camera.stopPreview(); camera.release(); camera = null; } }
上面是几个比较重要的方法,下面是整个Activity的代码:
public class MainActivity extends AppCompatActivity { private Camera camera; private SurfaceView surfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); surfaceView = (SurfaceView) findViewById(R.id.surfaceView); } @Override protected void onStart() { super.onStart(); initCamera(); surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { holder.removeCallback(this); try { camera.setPreviewDisplay(holder); camera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } }); } @Override protected void onStop() { super.onStop(); releaseCamera(); } private void initCamera() { camera = Camera.open(); } private void releaseCamera() { if (camera != null) { // 释放前先停止预览 camera.setPreviewCallback(null); camera.stopPreview(); camera.release(); camera = null; } } }
值得一提的是,需要在SurfaceViewHolder创建之后,才能调用Camera的startPreview方法,否则视频图像是不会显示到SurfaceView中去的。
本篇文章DEMO下载。