当前位置: 代码迷 >> Android >> Android多媒体刻制-MediaRecorder视频录制
  详细解决方案

Android多媒体刻制-MediaRecorder视频录制

热度:25   发布时间:2016-04-27 22:27:35.0
Android多媒体录制--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 view112      */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     @Override127     public void onPreviewFrame(byte[] data, Camera camera) {128 129     }130 }
WorkRecorder

 

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

不足:

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

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

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

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

 

  相关解决方案