• Android开发-用MediaRecorder类进行视频的录制
  • 专心滴打铁 发表于 2015/10/29 12:43:00 | 分类标签: MediaRecorder类的用法
  • Android使用MediaRecorder类进行视频的录制。
    需要注意,使用MediaRecorder 录音录像 的设置代码步骤一定要按照API指定的顺序来设置,否则报错

    步骤为:

    1、设置视频源,音频源,即输入源

    2、设置输出格式

    3、设置音视频的编码格式


    一、首先看布局文件,这里有一个SurfaceView,这是一个绘制容器,可以直接从内存或者DMA等硬件接口取得图像数据,

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:tools="http://schemas.android.com/tools"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:orientation="vertical"
                    tools:context="com.xqx.mediarecorder.app.WorkRecorder">
    
            <!-- 开始录制按钮 -->
            <Button
                    android:id="@+id/startRecord"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:onClick="btnStartRecord"
                    android:text="开始录制"
                    />
    
            <Button
                    android:id="@+id/stopRecord"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:onClick="btnStopRecord"
                    android:text="停止录制"
                    />
            <SurfaceView
                    android:id="@+id/surView"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"/>
    </LinearLayout>

    二、Activity 代码

    1、首先看下成员变量

        // 开始录制,停止录制按钮
        private Button startRecord,stopRecord;
        // 显示预览的SurfaceView
        private SurfaceView surfaceView;
        // 标记,判断当前是否正在录制
        boolean isRunning = false;
        // 录制类
        private MediaRecorder recorder;
        // 存储文件
        private File saveFile;

    2、onCreate()方法中进行一些初始化

         startRecord = (Button) findViewById(R.id.startRecord);
            stopRecord = (Button) findViewById(R.id.stopRecord);
            surfaceView = (SurfaceView) findViewById(R.id.surView);
    
            // onCreate()初始化 ,一开始肯定没有开始录制,所以停止按钮不可点击
            stopRecord.setEnabled(false);
         // 设置Surface不需要维护自己的缓冲区
            surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            // 设置分辨率
            surfaceView.getHolder().setFixedSize(320, 280);
            // 设置该组件不会让屏幕自动关闭
            surfaceView.getHolder().setKeepScreenOn(true);

    3、现在看“开始录制”监听事件

    ----3.1

     创建MediaRecorder对象
       recorder = new MediaRecorder();
       recorder.reset();

    ----3.2 设置三步,顺序固定

    //1.设置采集声音
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    //设置采集图像
    recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
    //2.设置视频,音频的输出格式
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    //3.设置音频的编码格式
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    //设置图像的编码格式
    recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

    ----3.3 其他可选设置,更多请查看API

    //设置立体声
    recorder.setAudioChannels(2);
    //设置最大录像时间 单位:毫秒
    recorder.setMaxDuration(600000);
    //设置最大录制的大小 单位,字节
    recorder.setMaxFileSize(1024*1024);
    //音频一秒钟包含多少数据位
    recorder.setAudioEncodingBitRate(128);
    //设置选择角度,顺时针方向,因为默认是逆向90度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度
    recorder.setOrientationHint(90);
    //设置录像的分辨率
    recorder.setVideoSize(176, 144);

    ----3.4 设置文件存储路径,这里简陋了,实际开发中需要判断是否有外部存储,是否有目标目录 ,是否已经存在相同名字的文件 等问题

    //设置输出文件路径
    
    saveFile = new File(Environment.getExternalStorageDirectory()
                            .getCanonicalFile() + "/myvideo.mp4");
    recorder.setOutputFile(saveFile.getAbsolutePath());

    ----3.5 使用SurfaceView进行预览

    recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());   

    ----3.6 开始录制

    recorder.prepare();
    //开始录制
    recorder.start();
    //让开始按钮不可点击,停止按钮可点击
    startRecord.setEnabled(false);
    stopRecord.setEnabled(true);
    isRunning = true;

    ----3.7 停止录制

     //停止录制
    recorder.stop();
    //释放资源
    recorder.release();
    recorder = null;
    //设置开始按钮可点击,停止按钮不可点击
    startRecord.setEnabled(true);
    stopRecord.setEnabled(false);

    完整代码:

      1 package com.xqx.mediarecorder.app;
      2 
      3 import android.app.Activity;
      4 import android.media.MediaRecorder;
      5 import android.os.Bundle;
      6 import android.os.Environment;
      7 import android.view.SurfaceHolder;
      8 import android.view.SurfaceView;
      9 import android.view.View;
     10 import android.widget.Button;
     11 import android.hardware.Camera;
     12 
     13 import java.io.File;
     14 import java.io.IOException;
     15 
     16 public class WorkRecorder extends Activity implements Camera.PreviewCallback {
     17 
     18     // 开始录制,停止录制按钮
     19     private Button startRecord,stopRecord;
     20     // 显示预览的SurfaceView
     21     private SurfaceView surfaceView;
     22     // 标记,判断当前是否正在录制
     23     boolean isRunning = false;
     24     // 录制类
     25     private MediaRecorder recorder;
     26     // 存储文件
     27     private File saveFile;
     28     @Override
     29     protected void onCreate(Bundle savedInstanceState) {
     30         super.onCreate(savedInstanceState);
     31         setContentView(R.layout.activity_work_recorder);
     32 
     33         startRecord = (Button) findViewById(R.id.startRecord);
     34         stopRecord = (Button) findViewById(R.id.stopRecord);
     35         surfaceView = (SurfaceView) findViewById(R.id.surView);
     36 
     37         // onCreate()初始化 ,一开始肯定没有开始录制,所以停止按钮不可点击
     38         stopRecord.setEnabled(false);
     39 
     40         // 设置Surface不需要维护自己的缓冲区
     41         surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
     42         // 设置分辨率
     43         surfaceView.getHolder().setFixedSize(320, 280);
     44         // 设置该组件不会让屏幕自动关闭
     45         surfaceView.getHolder().setKeepScreenOn(true);
     46 
     47     }
     48 
     49     /**
     50      * 开始录制
     51      * @param view
     52      */
     53     public void btnStartRecord(View view) {
     54 
     55         // 首先判断当前是否处理视频录制状态,只有不是录制状态的时候,才可以开始录制
     56         if (!isRunning){
     57             try {
     58                 //创建MediaRecorder对象
     59                 recorder = new MediaRecorder();
     60                 recorder.reset();
     61 
     62 
     63                 //1.设置采集声音
     64                 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
     65                 //设置采集图像
     66                 recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
     67                 //2.设置视频,音频的输出格式
     68                 recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
     69                 //3.设置音频的编码格式
     70                 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
     71                 //设置图像的编码格式
     72                 recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
     73 
     74                 //设置立体声
     75                 recorder.setAudioChannels(2);
     76                 //设置最大录像时间 单位:毫秒
     77                 recorder.setMaxDuration(600000);
     78                 //设置最大录制的大小 单位,字节
     79                 recorder.setMaxFileSize(1024*1024);
     80                 //音频一秒钟包含多少数据位
     81                 recorder.setAudioEncodingBitRate(128);
     82                 //设置选择角度,顺时针方向,因为默认是逆向90度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度
     83                 recorder.setOrientationHint(90);
     84 
     85                 //设置输出文件路径
     86 //                saveFile = FileUtils.getMediaRecoderFolder(this);
     87                 saveFile = new File(Environment.getExternalStorageDirectory()
     88                         .getCanonicalFile() + "/myvideo.mp4");
     89 //        recorder.setVideoSize(320, 240);
     90 //        recorder.setVideoFrameRate(20);
     91                 recorder.setOutputFile(saveFile.getAbsolutePath());
     92                 //使用SurfaceView预览
     93                 recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
     94                 recorder.prepare();
     95                 //开始录制
     96                 recorder.start();
     97                 //让开始按钮不可点击,停止按钮可点击
     98                 startRecord.setEnabled(false);
     99                 stopRecord.setEnabled(true);
    100                 isRunning = true;
    101             } catch (IOException e) {
    102                 e.printStackTrace();
    103             }
    104 
    105 
    106         }
    107     }
    108 
    109     /**
    110      * 结束录制
    111      * @param view
    112      */
    113     public void btnStopRecord(View view) {
    114         if (isRunning){
    115             //停止录制
    116             recorder.stop();
    117             //释放资源
    118             recorder.release();
    119             recorder = null;
    120             //设置开始按钮可点击,停止按钮不可点击
    121             startRecord.setEnabled(true);
    122             stopRecord.setEnabled(false);
    123         }
    124     }
    125 
    126     @Override
    127     public void onPreviewFrame(byte[] data, Camera camera) {
    128 
    129     }
    130 }

     

    本例子只是一个简单的Demo,用于给刚接触MediaRecorder音频录制的coder学习,存在一些Bug和不足,各位coder可以继续拓展

    不足:

    1、只有当点击“开始录制”的时候SurfaceView组件才可以看到摄像头拍摄的预览,否则是一篇黑,这里可以看下Canera类,进行相应的调整

    2、保存路径,需要判断是否有外部存储,存储空间是否足够,路径是否不存在,是否有已有的文件名相同的文件存在等问题,设置文件的名字,我这里是固定路径固定文件名

    3、摄像预览效果是有90度旋转的,这里需要大家个人去看下MedioRecoder的API 去进行设置

    4、没有设置对焦,像素不清楚,摄像宽高变形

  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:专心滴打铁
  • 加入时间:2013/7/13 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮