Android MediaRecorder 后台视屏录制

MediaRecorder ,一般用在多媒体视频录制上面,今天我们就来聊聊视频录制,首先录制视频我们少不了要用Camera,

1、SurfaceView 用于承载画面

    这里我们需要首先是implements SurfaceHolder.Callback,这样我们才能在surface创建的时候初始化相机渲染画面, 在画面销毁的时候销毁相机

2、初始化相机Camera

3、 初始化震动传感器监听 用于录制视频

4、SoundPool  用于开始录像时播放的声音

5、配置MediaRecorder 的录制参数后开始录制

6、停止录像








MainActivity.class


package com.testopensourceapplication.recorderdemo;

import android.content.Context;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.graphics.Color;
import android.hardware.Camera;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener ,SurfaceHolder.Callback{

    public static CustomProgressDialog progressDialog;

    SurfaceView surfaceView;

    TextView timer;
    ImageView recording;

    LinearLayout ll_hud_record_viewc;
    TextView start;
    TextView save;
    TextView  photo;
    TextView stop;


    private String innerSDcard;// 储存内部SD卡路径
    public static String rootpath;
    private String extSDcard;// 储存外部SD卡的路径(需要root权限)
    private MediaRecorder mediaRecorder;// 录制视频的类
    private SensorManager sensorManager;// 检测震动相关对象(加速度传感器)


    private final int MENU_HIDE_MSG = 0x001;
    private final int TIMER_GOING_MSG = 0x002;
    private final int RECORDER_RESTART_MSG = 0x003;
    private final int LAUNCH_RECORD = 0x004;
    private int textColor;
    private boolean isRecording = false;
    private String nowTime;
    private int second;
    private int minute;
    private int hour;
    private Camera mCamera;
    private SurfaceHolder surfaceHolder;
    private Camera.Size previewSize;
    private boolean safeToTakePicture = false;
    private SoundPool soundPool;
    private int cameraSound;// 音效的ID


    /**
     * 定时器设置,实现计时
     */
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == TIMER_GOING_MSG) {

                handler.sendEmptyMessageDelayed(TIMER_GOING_MSG, 1000);
                second++;
                if (second >= 60) {
                    minute++;
                    second = second % 60;
                }
                if (minute >= 60) {
                    hour++;
                    minute = minute % 60;
                }
                timer.setText(RecordUtils.format(hour) + ":"
                        + RecordUtils.format(minute) + ":"
                        + RecordUtils.format(second));
            }
            if (msg.what == RECORDER_RESTART_MSG) {
                prepareRecorder();
            }
            if (msg.what == MENU_HIDE_MSG) {
                start.setVisibility(View.GONE);
                stop.setVisibility(View.GONE);
                save.setVisibility(View.GONE);
                photo.setVisibility(View.GONE);

            }
            if (msg.what == LAUNCH_RECORD) {
                RecordUtils.spaceNotEnoughDeleteTempFile(MainActivity.this, rootpath);
                if (mediaRecorder == null) {
                    prepareRecorder();
                } else {
                    Toast.makeText(MainActivity.this, "视频录制中", Toast.LENGTH_SHORT)
                            .show();
                }
            }
            super.handleMessage(msg);
        }

    };

    //拍照的回调
    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            String path = innerSDcard + "/infisight/Recorders/photo/";
            File photoFile  = new File(path);
            if(!photoFile.exists()){
                photoFile.mkdirs();
            }
            if (isRecording == false) {
                mCamera.stopPreview();
            }
            File pictureFile  =new File(path,System.currentTimeMillis()+".jpg");
            try{
                FileOutputStream fos =new FileOutputStream(pictureFile);
                fos.write(data);
                fos.close();
            }catch (Exception e){
                Log.d("takePhoto", "File not found: " + e.getMessage());
            }
            safeToTakePicture = true;
            if (isRecording == false) {
                mCamera.startPreview();
            }

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initActivity();
    }

    private void initView(){
        // SurfaceView 用于承载画面
        surfaceView = (SurfaceView) findViewById(R.id.surfaceview);
        timer = (TextView) findViewById(R.id.timer);
        recording = (ImageView) findViewById(R.id.recording);
        ll_hud_record_viewc = (LinearLayout) findViewById(R.id.ll_hud_record_view);
        start = (TextView) findViewById(R.id.start);
        save = (TextView) findViewById(R.id.save);
        photo = (TextView) findViewById(R.id.photo);
        stop = (TextView) findViewById(R.id.stop);


        SurfaceHolder holder = surfaceView.getHolder();// 取得holder
        holder.addCallback(this); // holder加入回调接口

        // 用于开始录像时播放的声音   音效的数量,类型,质量
        soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
        //加载声音资源
        cameraSound =
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值