Android使用MediaRecorder类进行录制视频

 更新时间:2015年10月29日 14:31:54   作者:听着music睡  
这篇文章主要介绍了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);

完整代码:

 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、没有设置对焦,像素不清楚,摄像宽高变形

相关文章

  • 使用Android Studio检测内存泄露(LeakCanary)

    使用Android Studio检测内存泄露(LeakCanary)

    本篇文章主要介绍了用Android Studio检测内存泄露的问题的解决方法,Android Studio在为我们提供了良好的编码体验的同时,也提供了许多对App性能分析的工具,下面我们一起来了解一下。
    2016-12-12
  • android dialog根据弹窗等级排序显示的示例代码

    android dialog根据弹窗等级排序显示的示例代码

    这篇文章主要介绍了android dialog根据弹窗等级排序显示,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Android自定义水平渐变进度条

    Android自定义水平渐变进度条

    这篇文章主要为大家详细介绍了Android自定义水平渐变进度条,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • 如何在Android App中接入微信支付

    如何在Android App中接入微信支付

    这篇文章主要介绍了如何在Android App中接入微信支付,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-03-03
  • Android开发MediaCodec和lamemp3多段音频截取拼接

    Android开发MediaCodec和lamemp3多段音频截取拼接

    这篇文章主要为大家介绍了Android开发使用MediaCodec和lamemp3实现多段音频截取拼接的编程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • android ListView自动滚动方法

    android ListView自动滚动方法

    直接在Layout中写即可,注意下面的stackFromBottom以及transcriptMode这两个属性
    2013-01-01
  • android使用webwiew载入页面使用示例(Hybrid App开发)

    android使用webwiew载入页面使用示例(Hybrid App开发)

    Hybrid App 融合 Web App 的原理就是嵌入一个WebView组件,可以在这个组件中载入页面,相当于内嵌的浏览器,下面是使用示例
    2014-03-03
  • Android实现九宫格解锁

    Android实现九宫格解锁

    根据最近Android项目需要,实现九宫格解锁效果,下面小编给大家分享了具体实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Flutter应用框架搭建实现屏幕适配方案详解

    Flutter应用框架搭建实现屏幕适配方案详解

    移动设备多样性,特别是Android的碎片化严重,存在各种各样的分辨率,flutter跨平台开发又需要同时支持Android和IOS,为尽可能的还原设计图效果提升用户的体验,根据设计稿设计屏幕ui的时候我们需要考虑到屏幕适配的问题
    2022-11-11
  • Android实现zip文件压缩及解压缩的方法

    Android实现zip文件压缩及解压缩的方法

    这篇文章主要介绍了Android实现zip文件压缩及解压缩的方法,涉及Android针对文件的遍历及zip压缩与解压缩的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07

最新评论