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

(0)

相关推荐

  • 19个Android常用工具类汇总

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.PreferencesUtils.JSONUtils.FileUtils.ResourceUtils.StringUtils.ParcelUtils.RandomUtils.ArrayUtils.ImageUtils.ListUtils.MapUtils.ObjectUtils.SerializeUtils.

  • Android音频录制MediaRecorder之简易的录音软件实现代码

    使用MediaRecorder的步骤:1.创建MediaRecorder对象2.调用MediRecorder对象的setAudioSource()方法设置声音的来源,一般传入MediaRecorder.MIC3.调用MediaRecorder对象的setOutputFormat()设置所录制的音频文件的格式4.调用MediaRecorder对象的setAudioRncoder().setAudioEncodingBitRate(int bitRate).setAudioSamlingRate(i

  • Android开发之多媒体文件获取工具类实例【音频,视频,图片等】

    本文实例讲述了Android开发之多媒体文件获取工具类.分享给大家供大家参考,具体如下: package com.android.ocr.util; import java.io.File; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import

  • Android截取视频帧并转化为Bitmap示例

    MainActivity如下: 复制代码 代码如下: package cn.testmediametadataretriever; import java.io.File; import java.io.FileOutputStream; import android.media.MediaMetadataRetriever; import android.os.Bundle; import android.os.Environment; import android.app.Activity;

  • Android获取SD卡上图片和视频缩略图的小例子

    如何判断文件呢? 可以通过Cursor遍历数据库,对比INTERNAL_CONTENT_URI字段的值,这是一个Uri,这里保存着Android手机SD卡上的多媒体文件完整路径. [java] 复制代码 代码如下: Uri originalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;                 //若为视频则为MediaStore.Video.Media.EXTERNAL_CONTENT_URI;          

  • Android音频处理之通过AudioRecord去保存PCM文件进行录制,播放,停止,删除功能

    音频这方面很博大精深,我这里肯定讲不了什么高级的东西,最多也只是一些基础类知识,首先,我们要介绍一下Android他提供的录音类,实际上他有两个,一个是MediaRecorder,还有一个就是我们今天要用到的AudioRecord,那他们有什么区别呢? 一.区别 MediaRecorder和AudioRecord都可以录制音频,区别是MediaRecorder录制的音频文件是经过压缩后的,需要设置编码器.并且录制的音频文件可以用系统自带的Music播放器播放. 而AudioRecord录制的是P

  • Android提高之MediaPlayer播放网络音频的实现方法

    前面有文章曾经地介绍过MediaPlayer的基本用法,这里就更加深入地讲解MediaPlayer的在线播放功能.本文主要实现MediaPlayer在线播放音频的功能,由于在线视频播放比在线音频播放复杂,因此先介绍在线音频播放的实现,这样可以帮助大家逐步深入了解MediaPlayer的在线播放功能. 先来看看本文程序运行的结果如下图所示: main.xml的源码如下: <?xml version="1.0" encoding="utf-8"?> <

  • Android提高之MediaPlayer播放网络视频的实现方法

    前面讲解了MediaPlayer播放网络音频,主要介绍了MediaPlayer关于网络音频的缓冲和进度条控制的方法,本文再来讲解一下MediaPlayer播放网络视频的方法.播放网络视频比播放网络音频需要多一个SurfaceView而已,在已经熟悉了MediaPlayer播放网络音频之后,相信大家对本文所述的播放网络视频也能很快地掌握. 先来看看本文程序运行截图,如下所示: 本文程序的视频来自http://daily3gp.com,大家可以替换程序中的视频链接,试试其他影片. main.xml的

  • android实用工具类分享(获取内存/检查网络/屏幕高度/手机分辨率)

    复制代码 代码如下: public class CommonUtil { public static boolean hasSDCard() { String status = Environment.getExternalStorageState();  return status.equals(Environment.MEDIA_MOUNTED); } /**  * 获取最大内存  *   * @return  */ public static long getMaxMemory() { r

  • android多媒体类VideoView使用方法详解

    一.概述 VideoView类将视频的显示和控制集于一身,我们可以借助它完成一个简易的视频播放器.VideoView和MediaPlayer也比较相似. 二.VideoView的使用方法 它主要有以下几种常用方法 步骤: 1.指定视频文件的路径, 2.接下来调用start()方法就可以开始播放视频,pause()方法就会暂停播放,resume()方法就会重新播放 注:获取视频文件也需要运行时权限,所有相关逻辑也需要写.       最后不要忘记在AndroidManifest.xml文件中声明用

  • Android使用VideoView播放本地视频和网络视频的方法

    1.效果展示 2.布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="matc

随机推荐