MediaRecorder录制视频

MediaRecorder

这个类主要用来做多媒体录音和录视频的

首先是录制视频的mainActivity.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="8">
        <SurfaceView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/surfaceview"
            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
        <Button
            android:id="@+id/stop"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:text="暂停"
            android:layout_weight="1"/>
        <Button
            android:id="@+id/start"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:text="开始"
            android:layout_weight="1"/>
        <Button
            android:id="@+id/starting"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:text="播放"
            android:onClick="btnClick"
            android:layout_weight="1"/>
    </LinearLayout>

</LinearLayout>

然后是录制视频的MainActivity类

这个类中有一个if判断这个判断是用来获取Android 6.0以上版本的动态权限


public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
    private Button start;// 开始录制按钮
    private Button stop;// 停止录制按钮
    private MediaRecorder mediarecorder;// 录制视频的类
    private SurfaceView surfaceview;// 显示视频的控件
    private SurfaceHolder surfaceHolder;
    private int REQUEST_TAKE_PHOTO_PERMISSION = 1;
    private String FileName = "/sdcard/love.3gp";
    private Camera camera;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置全屏
        // 选择支持半透明模式,在有surfaceview的activity中使用。
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        setContentView(R.layout.activity_main);
        
        //这个if判断是用来加Android6.0以上版本的动态权限
     
        if (CommonUtil.isCameraCanUse()) {
            init();
        } else {
            //   Toast.makeText(getActivity(),"请打开此应用的摄像头权限!",Toast.LENGTH_SHORT).show();
            //申请权限, REQUEST_TAKE_PHOTO_PERMISSION是自定义的常量
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.CAMERA},
                    REQUEST_TAKE_PHOTO_PERMISSION);
        }

    }

    private void init() {
        start = (Button) this.findViewById(R.id.start);
        stop = (Button) this.findViewById(R.id.stop);

        start.setOnClickListener(listener);
        stop.setOnClickListener(listener);
        surfaceview = (SurfaceView) this.findViewById(R.id.surfaceview);
        SurfaceHolder holder = surfaceview.getHolder();// 取得holder
        holder.addCallback(this); // holder加入回调接口
        // setType必须设置,要不出错.
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
    public void btnClick(View view){
        Intent intent = new Intent(this,Main2Activity.class);
        intent.putExtra("fileName",FileName);
        startActivity(intent);
    }

    private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v == start) {
                mediarecorder = new MediaRecorder();// 创建mediarecorder对象
                // 设置录制视频源为Camera(相机)
                camera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
                if (camera!=null){
                //必须加这行代码否则,录制视频时会横屏
                    camera.setDisplayOrientation(90);
                    camera.unlock();
                    mediarecorder.setCamera(camera);
                }
                mediarecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
                // 设置录制完成后视频的封装格式THREE_GPP为3gp.MPEG_4为mp4
                mediarecorder
                        .setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                // 设置录制的视频编码h263 h264
                mediarecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
                //设置录制时,录制声音


                // 设置视频录制的分辨率。必须放在设置编码和格式的后面,否则报错
                mediarecorder.setVideoSize(640, 480);
                mediarecorder.setVideoEncodingBitRate(5*1024*1024);
                // 设置录制的视频帧率。必须放在设置编码和格式的后面,否则报错
                mediarecorder.setVideoFrameRate(20);
                mediarecorder.setPreviewDisplay(surfaceHolder.getSurface());
                // 设置视频文件输出的路径
                //这行代码是为了让你在,浏览视频时为竖屏,不设置这行代码视频进行播放时会横屏会很丑
                mediarecorder.setOrientationHint(90);
                mediarecorder.setOutputFile(FileName);
                Log.e("MainActivity", "未开始录制");
                try {
                    // 准备录制
                    mediarecorder.prepare();
                    Log.e("MainActivity", "准备录制");
                    // 开始录制
                    mediarecorder.start();
                    Log.e("MainActivity", "开始录制");
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (v == stop) {
                if (mediarecorder != null) {
                    // 停止录制
                    mediarecorder.stop();
                    // 释放资源
                    mediarecorder.release();
                    mediarecorder = null;
                }
            }

        }

    };

    public void surfaceChanged(SurfaceHolder holder, int format, int width,
                               int height) {
        // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
        surfaceHolder = holder;
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // 将holder,这个holder为开始在oncreat里面取得的holder,将它赋给surfaceHolder
        surfaceHolder = holder;
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // surfaceDestroyed的时候同时对象设置为null
        surfaceview = null;
        surfaceHolder = null;
        mediarecorder = null;
    }

}

播放视频时使用的Main2Activity.xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:id="@+id/start"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="开始"
            android:onClick="btnClick"/>
        <Button
            android:id="@+id/stop"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="暂停"
            android:onClick="btnClick"/>
        <Button
            android:id="@+id/cancel"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="返回"
            android:onClick="btnClick"/>
    </LinearLayout>

</LinearLayout>

播放视频时的Main2Activity类


public class Main2Activity extends AppCompatActivity {
    private VideoView mView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        init();
    }

    private void init() {
        Intent intent = getIntent();
        String fileName = intent.getStringExtra("fileName");

        mView = (VideoView) findViewById(R.id.videoView);
        //设置视频控制器
        mView.setMediaController(new MediaController(this));
        mView.setVideoPath(fileName);
        mView.requestFocus();
    }

    public void btnClick(View view){
        switch (view.getId()){
            case R.id.start:
                mView.start();
                break;
            case R.id.stop:
                mView.pause();
                break;
            case R.id.cancel:
                finish();
                break;
        }
    }
}

这个是MainActivity类中if判断中使用的工具类CommonUtil

import android.hardware.Camera;

/**
 * @className: CommonUtil
 * @classDescription: 通用工具类
 * @author: miao
 * @createTime: 2017年2月10日
 */
public class CommonUtil {

    public static boolean isCameraCanUse() {
            boolean canUse = true;
            Camera mCamera = null;
            try {
                mCamera = Camera.open();
            } catch (Exception e) {
                canUse = false;
            }
            if (canUse) {
                if (mCamera != null)
                    mCamera.release();
                mCamera = null;
            }
            return canUse;
    }
}

把这个类加到app中,这个类主要应用于Android 6.0以上的动态权限

发布了9 篇原创文章 · 获赞 2 · 访问量 1107
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览