android录像预览功能

public class MediaRecorderActivity extends Activity {
    private ImageButton record = null,stop = null;
    private TextView info = null;
    private MediaRecorder mediaRecorder = null;
    private String recordVideoSaveFileName = null;
    private boolean isRecord = false, hasProblem = false;
    private SurfaceView surface = null;
    private int width, height;
    private Camera camera;
    private FrameLayout preview;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE); // 不显示标题
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 高亮的风格显示
        setContentView(R.layout.media_recorder);
        recordVideoSaveFileName = getIntent().getStringExtra("file_path");


        camera = null;
        try {
            camera = Camera.open(0);
        } catch (Exception e) {
            Log.e("MediaRecorderActivity", e.toString());
            if (camera != null) {
                camera.release();
            }
            hasProblem = true;
        }
        //增加预览功能
        CameraPreview mPreview = new CameraPreview(this, camera);
        preview = (FrameLayout) findViewById(R.id.camera_preview);
        preview.addView(mPreview);


        if (camera != null) {
            Display display = getWindowManager().getDefaultDisplay();
            Camera.Parameters parameters = camera.getParameters();
            Camera.Size cs = getBestPreviewSize(display.getWidth(), display.getHeight(), parameters);
            width = cs.width;
            height = cs.height;
            setCameraDisplayOrientation(0); //设置摄像头的角度
        }
        record = (ImageButton) findViewById(R.id.record);
        stop = (ImageButton) findViewById(R.id.stop);
        info = (TextView) findViewById(R.id.video_info);
        surface = (SurfaceView) findViewById(R.id.surface);
        surface.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        surface.getHolder().setFixedSize(480, 800);
        record.setOnClickListener(new RecordOnClickListenerImpl());
        stop.setOnClickListener(new StopOnClickListenerImpl());
        stop.setEnabled(false);    // 停止录象的按钮暂时不可用
    }


    private class RecordOnClickListenerImpl implements OnClickListener {
        @Override
        public void onClick(View v) {
            releaseCamera();
            preview.removeAllViews();
            if (CommonTool.existSDcard()) {    // sd卡存在
                mediaRecorder = new MediaRecorder();
//                camera.unlock();
//                mediaRecorder.reset(); // 重置
//                mediaRecorder.setCamera(camera);
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
                mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                mediaRecorder.setOutputFormat(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).fileFormat);
                mediaRecorder.setVideoEncodingBitRate(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).videoBitRate);
                mediaRecorder.setVideoFrameRate(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).videoFrameRate);
                mediaRecorder.setVideoEncoder(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).videoCodec);
                mediaRecorder.setAudioEncodingBitRate(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).audioBitRate);
                mediaRecorder.setAudioSamplingRate(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).audioSampleRate);
                mediaRecorder.setAudioEncoder(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH).audioCodec);
                mediaRecorder.setOutputFile(recordVideoSaveFileName);
                mediaRecorder.setVideoSize(width, height);
                mediaRecorder.setOrientationHint(getRightOrientation(0));
                mediaRecorder.setPreviewDisplay(surface.getHolder().getSurface());
                try {
                    mediaRecorder.prepare();
                } catch (Exception e) {
                    Log.e("MediaRecorderActivity", e.toString());
                    releaseMediaRecorder();
                    hasProblem = true;
                }
                if (!hasProblem){
                    mediaRecorder.start();
                    info.setText("正在录象中...");
                    stop.setEnabled(true);
                    record.setEnabled(false);
                    isRecord = true;
                }
            }
        }
    }


    private class StopOnClickListenerImpl implements OnClickListener {
        @Override
        public void onClick(View v) {
            if (isRecord) {
                mediaRecorder.stop(); // stop the recording
                releaseMediaRecorder(); // release the MediaRecorder object
                releaseCamera();
                stop.setEnabled(false);
                record.setEnabled(true);
                CommonToast.showToast(MediaRecorderActivity.this, "录象结束,文件路径为:" + recordVideoSaveFileName, Toast.LENGTH_SHORT).show();
                // 设置结果,并进行传送
                MediaRecorderActivity.this.setResult(RESULT_OK);
                finish();
            }
        }
    }


    @Override
    protected void onPause() {
        super.onPause();
        releaseMediaRecorder();       // if you are using MediaRecorder, release it first
        releaseCamera();              // release the camera immediately on pause event
    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            super.finish();
            setResult(RESULT_CANCELED);
        }
        return false;
    }


    private Camera.Size getBestPreviewSize(int width, int height, Camera.Parameters parameters) {
        Camera.Size result = null;


        for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
            if (size.width <= width && size.height <= height) {
                if (result == null) {
                    result = size;
                } else {
                    int resultArea = result.width * result.height;
                    int newArea = size.width * size.height;


                    if (newArea > resultArea) {
                        result = size;
                    }
                }
            }
        }
        return (result);
    }


    //判断当前摄像头的角度
    private void setCameraDisplayOrientation(int cameraId) {
        camera.setDisplayOrientation(getRightOrientation(cameraId));
    }


    private int getRightOrientation(int cameraId){
        android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
        android.hardware.Camera.getCameraInfo(cameraId, info);
        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        int degrees = 0;
        switch (rotation) {
            case Surface.ROTATION_0:
                degrees = 0;
                break;
            case Surface.ROTATION_90:
                degrees = 90;
                break;
            case Surface.ROTATION_180:
                degrees = 180;
                break;
            case Surface.ROTATION_270:
                degrees = 270;
                break;
        }
        int result;
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360;  // compensate the mirror
        } else {  // back-facing
            result = (info.orientation - degrees + 360) % 360;
        }
        return result;
    }


    private void releaseMediaRecorder(){
        if (mediaRecorder != null) {
            mediaRecorder.reset();   // clear recorder configuration
            mediaRecorder.release(); // release the recorder object
            mediaRecorder = null;
//            camera.lock();           // lock camera for later use
        }
    }


    private void releaseCamera(){
        if (camera != null){
            camera.release();        // release the camera for other applications
            camera = null;
        }
    }

}


这是我在网上搜集资料,并查阅stackoverflow 相关网站得到的录像activity,传递一个保存的路径即可,有预览功能,但是目前只支持横屏,如果是竖屏,录像的时候预览图角度会有偏差,也是根据手机而异。

其中getRightOrientation这个函数是根据当前屏幕横竖屏来获得最佳的camera预览角度,不会因某些摄像头默认的角度不同而不同(某些摄像头会自动转90度),由谷歌官网提供,很好用。

getBestPreviewSize 这个函数是根据不同分辨率的手机选择最合适的camera录像分辨率,mediaRecorder.setVideoSize(width, height);这个函数如果设置的参数不被设备支持就容易报错,类似mediaRecorder start失败,所以这个函数的功能就是找出最合适的大小,从stackoverflow上获得。

CommonTool.existSDcard() 这个方法是判断sd卡是否存在。

具体实现: //判断SD卡是否存在
    public static boolean existSDcard() {
        if (android.os.Environment.getExternalStorageState().equals(
                android.os.Environment.MEDIA_MOUNTED)) {
            return true;
        } else {
            return false;
        }
    }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值