android获取帧保存到本地

来源:互联网 发布:发送短信的软件 编辑:程序博客网 时间:2024/06/04 00:41
package com.fx.realtimevideodemo;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.ImageFormat;import android.graphics.Matrix;import android.graphics.Rect;import android.graphics.YuvImage;import android.hardware.Camera;import android.media.MediaPlayer;import android.media.MediaRecorder;import android.os.Bundle;import android.os.Environment;import android.os.SystemClock;import android.support.v7.app.AppCompatActivity;import android.util.DisplayMetrics;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.View;import android.view.Window;import android.widget.Button;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, Camera.PreviewCallback {    private static final String TAG = "MainActivity";    private SurfaceView surfaceView;    private Button start, stop;    private boolean mStartedFlg = false;//是否正在录像    private boolean mIsPlay = false;//是否正在播放录像    private MediaRecorder mRecorder;    private SurfaceHolder mSurfaceHolder;    private Camera mCamera;    private MediaPlayer mediaPlayer;    private String path;    private int mPreviewWidth;    private int mPreviewHeight;    private boolean bIfPreview;    boolean isStart = false;    List<byte[]> dataList = new ArrayList();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        start = (Button) findViewById(R.id.start);        stop = (Button) findViewById(R.id.stop);        start.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                isStart = true;            }        });        stop.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                isStart = false;                Camera.Size size = mCamera.getParameters().getPreviewSize();                for (byte[] b : dataList) {                    try {                        YuvImage image = new YuvImage(b, ImageFormat.NV21, size.width, size.height, null);                        if (image != null) {                            ByteArrayOutputStream stream = new ByteArrayOutputStream();                            image.compressToJpeg(new Rect(0, 0, size.width, size.height), 80, stream);                            Bitmap bmp = BitmapFactory.decodeByteArray(stream.toByteArray(), 0, stream.size());                            //图片旋转                            rotateMyBitmap(bmp);                            stream.close();                        }                    } catch (Exception ex) {                        Log.e("Sys", "Error:" + ex.getMessage());                    }                }            }        });        DisplayMetrics dm = new DisplayMetrics();        //取得窗口属性        getWindowManager().getDefaultDisplay().getMetrics(dm);        mPreviewWidth = dm.widthPixels;        mPreviewHeight = dm.heightPixels;        Log.i(TAG,"mPreviewWidth="+mPreviewWidth+"==mPreviewHeight=="+mPreviewHeight);        initSurfaceView();    }    private void initSurfaceView() {        surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);        mSurfaceHolder = surfaceView.getHolder(); // 绑定SurfaceView,取得SurfaceHolder对象        mSurfaceHolder.addCallback(this); // SurfaceHolder加入回调接口        mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);// 設置顯示器類型,setType必须设置    }        int i= 0;    @Override    public void onPreviewFrame(byte[] data, Camera camera) {        Log.i(TAG , "onPreviewFrame"+i);        if (i<50 && isStart) {            i++;            dataList.add(data);        }    }    public void rotateMyBitmap(Bitmap bmp){        //*****旋转一下        Matrix matrix = new Matrix();        matrix.postRotate(270);        Bitmap nbmp2 = Bitmap.createBitmap(bmp, 0,0, bmp.getWidth(),  bmp.getHeight(), matrix, true);        saveBitmap(nbmp2);    }    public void saveBitmap(Bitmap bitmap) {        // 首先保存图片        Log.i(TAG, "saveBitmap");        File appDir = new File(Environment.getExternalStorageDirectory(), "zxing_image");        if (!appDir.exists()) {            appDir.mkdir();        }        String fileName = SystemClock.currentThreadTimeMillis() + ".png";        File file = new File(appDir, fileName);        Log.i(TAG, "file="+file.toString());        try {            FileOutputStream fos = new FileOutputStream(file);            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);            fos.flush();            fos.close();        } catch (Exception e) {            e.printStackTrace();        }    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_FRONT);        try {            Log.i(TAG, "SurfaceHolder.Callback:surface Created");            mCamera.setPreviewDisplay(mSurfaceHolder);//            mCamera.setOneShotPreviewCallback(this);            mCamera.setPreviewCallback(this);        } catch (IOException e) {            e.printStackTrace();            if (null != mCamera) {                mCamera.release();                mCamera = null;            }            Log.i(TAG + "initCamera", e.getMessage());        }    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        initCamera();        // 开始预览        mCamera.startPreview();        bIfPreview = true;    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        if (null != mCamera) {            mCamera.setPreviewCallback(null); //!!这个必须在前,不然退出出错            mCamera.stopPreview();            bIfPreview = false;            mCamera.release();            mCamera = null;        }    }    /**     * 获取SD path     *     * @return     */    public String getSDPath() {        File sdDir = null;        boolean sdCardExist = Environment.getExternalStorageState()                .equals(android.os.Environment.MEDIA_MOUNTED); // 判断sd卡是否存在        if (sdCardExist) {            sdDir = Environment.getExternalStorageDirectory();// 获取跟目录            return sdDir.toString();        }        return null;    }    private void initCamera(){//surfaceChanged中调用        //CameraID表示0或者1,表示是前置摄像头还是后置摄像头        mCamera.setDisplayOrientation(90);        //参数设置        Camera.Parameters parameters = mCamera.getParameters();        //设置放大倍数        parameters.setZoom(12);        parameters.setPreviewFrameRate(30);        //开启闪光灯         parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);        //参数设置赋给Camera对象        mCamera.setParameters(parameters);    }}
原创粉丝点击