Android简易录像机

直接上代码。

一、AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.devin.simplevideorecorder">

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/rec_video"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <activity android:name=".MainActivity"
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

二、布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.devin.simplevideorecorder">

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/rec_video"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <activity android:name=".MainActivity"
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
三、主程序MainActivity.java

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {

    @Bind(R.id.btn_recordVideo)
    ImageView btnRecordVideo;//录制视频
    @Bind(R.id.btn_stop)
    ImageView btnStop;//停止录制
    @Bind(R.id.sfv_preview)
    SurfaceView surfaceView;//预览窗口

    private Camera camera = null;//摄像头
    private SurfaceHolder holder;//SurfaceView控制器
    private MediaRecorder recorder;//媒体录制器
    private File savePath;//保存文件夹
    private String saveFileName;//保存文件名
    private File saveFile;//保存文件
    private int scnWidth;//屏幕宽
    private int scnHeight;//屏幕高

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        initView();
    }

    /**
     * 初始化
     */
    private void initView() {
        holder = surfaceView.getHolder();
        holder.setKeepScreenOn(true);//设置屏幕常亮
        holder.addCallback(this);//添加回调监控
        //获取屏幕宽高
        WindowManager manager = (WindowManager) getSystemService(WINDOW_SERVICE);
        DisplayMetrics metrics = new DisplayMetrics();
        manager.getDefaultDisplay().getMetrics(metrics);
        scnWidth = metrics.widthPixels;
        scnHeight = metrics.heightPixels;
        holder.setFixedSize(scnWidth, scnHeight);//录制区域的尺寸的尺寸

        btnRecordVideo.setEnabled(true);
        btnStop.setEnabled(false);
    }

    /**
     * 鼠标点击事件监听
     *
     * @param view
     */
    @OnClick({R.id.btn_recordVideo, R.id.btn_stop})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_recordVideo:
                startRecordVideo();//录制视频
                break;
            case R.id.btn_stop:
                stopRecord();//停止录制
                break;
            default:
                break;
        }
    }

    /**
     * 停止录制
     */
    private void stopRecord() {
        if (recorder != null) {
            recorder.stop();
            Toast.makeText(this, "录制文件保存在" + saveFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();
            camera = getCamera();
            startPreview(camera, holder);//重新开始预览
            btnRecordVideo.setEnabled(true);
            btnStop.setEnabled(false);
        }
    }

    /**
     * 视频录制
     */
    private void startRecordVideo() {
        savePath = Environment.getExternalStorageDirectory();
        saveFileName = "record" + System.currentTimeMillis() + ".3gp";
        saveFile = new File(savePath, saveFileName);

        if (recorder == null) {
            recorder = new MediaRecorder();
        }
        recorder.reset();

        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);//设置视频源
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音频源

        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);//设置输出格式

        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);//设置视频编码
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码

        recorder.setOutputFile(saveFile.getAbsolutePath());//设置输出文件

        recorder.setVideoSize(1920, 1080);//设置分辨率
        recorder.setVideoFrameRate(15);//设置帧率

        releaseCamera();//摄像头停止预览
        recorder.setPreviewDisplay(holder.getSurface());//给recorder设置预览窗口

        try {
            recorder.prepare();
            recorder.start();

            Toast.makeText(this, "开始录制视频...", Toast.LENGTH_SHORT).show();
            btnRecordVideo.setEnabled(false);
            btnStop.setEnabled(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (camera == null) {
            camera = getCamera();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseCamera();
    }

    /**
     * 获取相机
     *
     * @return
     */
    private Camera getCamera() {
        Camera camera = Camera.open();
        Camera.Parameters parameters = camera.getParameters();//获得相机的参数
        parameters.setPreviewSize(scnWidth, scnHeight);//设置预览尺寸
        return camera;
    }

    /**
     * 开始预览
     */
    private void startPreview(Camera camera, SurfaceHolder holder) {
        try {
            camera.setPreviewDisplay(holder);//设置预览窗口
//            camera.setDisplayOrientation(90);//旋转镜头
            camera.startPreview();//开始预览
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 释放资源
     */
    public void releaseCamera() {
        if (camera != null) {
            camera.setPreviewCallback(null);//取消回调
            camera.stopPreview();//停止预览
            camera.release();//释放资源
            camera = null;//清除对象
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        startPreview(camera, holder);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        camera.stopPreview();
        startPreview(camera, holder);
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        releaseCamera();
    }
}

运行结果不错。录完接着预览。不过像素比的问题依然存在。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值