Android使用MediaRecorder类进行录制视频

步骤为:

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进行预览

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

----3.6 开始录制

?
1
2
3
4
5
6
7
recorder.prepare();
//开始录制
recorder.start();
//让开始按钮不可点击,停止按钮可点击
startRecord.setEnabled( false );
stopRecord.setEnabled( true );
isRunning = true ;

----3.7 停止录制

?
1
2
3
4
5
6
7
8
//停止录制
recorder.stop();
//释放资源
recorder.release();
recorder = null ;
//设置开始按钮可点击,停止按钮不可点击
startRecord.setEnabled( true );
stopRecord.setEnabled( false );

完整代码:

package com.xqx.mediarecorder.app;
 import android.app.Activity;
 import android.media.MediaRecorder;
 import android.os.Bundle;
 import android.os.Environment;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 import android.view.View;
import android.widget.Button;
import android.hardware.Camera;
import java.io.File;
import java.io.IOException;
public class WorkRecorder extends Activity implements Camera.PreviewCallback {
  // 开始录制,停止录制按钮
  private Button startRecord,stopRecord;
  // 显示预览的SurfaceView
  private SurfaceView surfaceView;
  // 标记,判断当前是否正在录制
  boolean isRunning = false;
  // 录制类
  private MediaRecorder recorder;
  // 存储文件
  private File saveFile;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_work_recorder);
    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(, );
    // 设置该组件不会让屏幕自动关闭
    surfaceView.getHolder().setKeepScreenOn(true);
  }
  /**
   * 开始录制
   * @param view
   */
  public void btnStartRecord(View view) {
    // 首先判断当前是否处理视频录制状态,只有不是录制状态的时候,才可以开始录制
    if (!isRunning){
      try {
        //创建MediaRecorder对象
        recorder = new MediaRecorder();
        recorder.reset();
        //.设置采集声音
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //设置采集图像
        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        //.设置视频,音频的输出格式
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_);
        //.设置音频的编码格式
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        //设置图像的编码格式
        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H);
        //设置立体声
        recorder.setAudioChannels();
        //设置最大录像时间 单位:毫秒
        recorder.setMaxDuration();
        //设置最大录制的大小 单位,字节
        recorder.setMaxFileSize(*);
        //音频一秒钟包含多少数据位
        recorder.setAudioEncodingBitRate();
        //设置选择角度,顺时针方向,因为默认是逆向度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度
        recorder.setOrientationHint();
        //设置输出文件路径
//        saveFile = FileUtils.getMediaRecoderFolder(this);
        saveFile = new File(Environment.getExternalStorageDirectory()
            .getCanonicalFile() + "/myvideo.mp");
//    recorder.setVideoSize(, );
//    recorder.setVideoFrameRate();
        recorder.setOutputFile(saveFile.getAbsolutePath());
        //使用SurfaceView预览
        recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
        recorder.prepare();
        //开始录制
        recorder.start();
        //让开始按钮不可点击,停止按钮可点击
        startRecord.setEnabled(false);
        stopRecord.setEnabled(true);
        isRunning = true;
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
  /**
  * 结束录制
  * @param view
  */
  public void btnStopRecord(View view) {
    if (isRunning){
      //停止录制
      recorder.stop();
      //释放资源
      recorder.release();
      recorder = null;
      //设置开始按钮可点击,停止按钮不可点击
      startRecord.setEnabled(true);
      stopRecord.setEnabled(false);
    }
  }
  @Override
  public void onPreviewFrame(byte[] data, Camera camera) {
  }
}

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

不足:

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

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

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

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










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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值