MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同。只是录制视频时不仅需要采集声音,还需要采集图像。为了让MediaRecorder录制时采集图像,应该在调用setAudioSource(int  audio_source)方法时再调用setVideoSource(int  video_source)方法来设置图像来源。

除此之外,还需要在调用setOutputFormat()设置输出文件格式之后进行如下步骤:

1、调用MediaRecorder对象的setVideoEncoder()、setVideoEncodingBitRate(int  bitRate)、setVideoFrameRate()设置所录制的视频的编码格式、编码位率、每秒多少帧等,这些参数将可以控制所录制的视频的品质、文件的大小。一般来说,视频品质越好,视频文件越大。

2、调用MediaRecorder的setPreviewDisplay(SurfaceView  sv)方法设置使用哪个SurfaceView来显示视频预览。

程序的界面布局如下:

<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"
  android:gravity="center_horizontal"
  tools:context=".RecodeVideo" >

  <LinearLayout
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    >

    <ImageButton
      android:id="@+id/recode"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@drawable/recode"
      />

    <ImageButton
      android:id="@+id/stop"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:src="@drawable/stop"
      />

  </LinearLayout>

  <!-- 显示视频预览的SurfaceView -->
  <SurfaceView
    android:id="@+id/sView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

</LinearLayout>

程序代码如下:

import java.io.File;

import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;

public class RecodeVideo extends Activity implements OnClickListener{
  //程序中的两个按钮
  ImageButton recode;
  ImageButton stop;
  //系统的视频文件
  File videoFile;
  MediaRecorder mRecorder;
  //显示视频预览的SurfaceView
  SurfaceView sView;
  //记录是否正在进行录制
  private boolean isRecoding = false;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_recode_video);
    //获取程序界面中的两个按钮
    recode = (ImageButton) findViewById(R.id.recode);
    stop = (ImageButton) findViewById(R.id.stop);
    //让stop按钮不可用
    stop.setEnabled(false);
    //为两个按钮的单击事件绑定监听器
    recode.setOnClickListener(this);
    stop.setOnClickListener(this);
    //获取程序界面中的SurfaceView
    sView = (SurfaceView) this.findViewById(R.id.sView);
    //下面设置Surface不需要自己维护缓冲区
    sView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    //设置分辨率
    sView.getHolder().setFixedSize(320, 280);
    //设置该组件让屏幕不会自动关闭
    sView.getHolder().setKeepScreenOn(true);
  }

  @Override
  public void onClick(View source) {
    switch (source.getId()) {
      //单击录制按钮
      case R.id.recode:
      if(!Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)){
        Toast.makeText(RecodeVideo.this, "SD卡不存在,请插入SD卡!", 5000).show();
        return;
      }
      try {
        //创建保存录制视频的视频文件
        videoFile = new File(Environment
              .getDownloadCacheDirectory().getCanonicalFile()+"/myvideo.mp4");
        //创建MediaRecorder对象
        mRecorder = new MediaRecorder();
        mRecorder.reset();
        //设置从麦克风采集声音
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        //设置从摄像头采集图像
        mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        //设置视频文件的输出格式(必须在设置声音编码格式、图像编码格式之前设置)
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
        //设置声音编码的格式
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        //设置图像编码的格式
        mRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP);
        mRecorder.setVideoSize(320, 280);
        //每秒4帧
        mRecorder.setVideoFrameRate(4);
        mRecorder.setOutputFile(videoFile.getAbsolutePath());
        //指定使用SurfaceView来预览视频
        mRecorder.setPreviewDisplay(sView.getHolder().getSurface());
        mRecorder.prepare();
        //开始录制
        mRecorder.start();
        System.out.println("----recoding----");
        //让recorde按钮不可用
        recode.setEnabled(false);
        //让stop按钮可用
        stop.setEnabled(true);
        isRecoding = true;
      } catch (Exception e) {
        e.printStackTrace();
      }
      break;
    //单击停止按钮
    case R.id.stop:
      //如果正在进行录制
      if(isRecoding){
        //停止录制
        mRecorder.stop();
        //释放资源
        mRecorder.release();
        mRecorder = null;
        //让record按钮可用
        recode.setEnabled(true);
        //让stop按钮不可用
        stop.setEnabled(false);
      }

    }

  }

}

运行该程序需要使用麦克风录制声音。需要使用摄像头采集图像,这些都需要授予相应的权限,不仅如此,由于该录制视频时视频文件增大的较快,可能需要使用外部存储器,因此需要对应用程序授予相应的权限。也就是需要在AndroidManifest.xml文件中增加如下授权配置:

<!-- 授予该程序录制声音的权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!-- 授予该程序使用摄像头的权限 -->
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 授予使用外部存储器的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

使用MediaRecorder录制视频短片的更多相关文章

  1. Android使用的开发MediaRecorder录制视频

    MediaRecorder除了使用录制音频.还可用于录制视频.关于MediaRecorder的具体解释大家能够參考<Android开发之MediaRecorder类具体解释>.使用Medi ...

  2. 【Android】用MediaRecorder录制视频太短崩的问题

    具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩. 错误信息: java.lang.RuntimeException: stop ...

  3. Android 用MediaRecorder录制视频太短崩的问题

    具体表现: 调用MediaRecorder的start()与stop()间隔不能小于1秒(有时候大于1秒也崩),否则必崩. 错误信息: java.lang.RuntimeException: stop ...

  4. Android音视频之MediaRecorder音视频录制

    前言: 公司产品有很多地方都需要上传音频视频,今天抽空总结一下音频视频的录制.学习的主角是MediaRecorder类. MediaRecorder类介绍: MediaRecorder类是Androi ...

  5. Android 开发 MediaRecorder使用Camera1配合录制视频

    前言 MediaRecorder可以不依靠Camera API 实现视频的录制,但是如果需要切换摄像头/设置对焦/选择分辨率等等就需要Camera来参与配合录制视频.这篇博客将介绍使用Camera1来 ...

  6. Android手机录制视频 实时传输(转载)

    最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...

  7. 【Android】 Android实现录音、播音、录制视频功能

    智能手机操作系统IOS与Android平分天下(PS:WP与其他的直接无视了),而Android的免费招来了一大堆厂商分分向Android示好,故Android可能会有“较好”的前景. Android ...

  8. 转:android 录制视频的Demo

    转:http://blog.csdn.net/peijiangping1989/article/details/7049991 在这里给出自己的一个测试DEMO,里面注释很详细.简单的视频录制功能. ...

  9. Android开发之打开闪光灯录制视频

    Android的SDK在线API上对录制视频的方法.步骤都写得非常清楚,但是如果没有一点思路,写起来也比较式费事.录制视频的全过程要打开闪光灯(可能是因为项目需要,或者特殊原因),则必须按照一定的顺序 ...

随机推荐

  1. iOS - 3DTouch 3D 触摸

    1.3DTouch 简介 3DTouch 是 iOS9 + 系统下,在 iPhone6s(iPhone6s Plus)+ 手机上才能够使用的功能. 1.1 3DTouch 基本类型 1.主屏幕快速选项 ...

  2. Nginx基础知识之————什么是 Nginx?

    本课时主要给大家讲解什么是 Nginx 和 Nginx 的功能,Nginx 与其他服务器的性能比较和 Nginx 的优点总结的知识,并结合实例让学员深入理解 Nginx 和 Nginx 的功能以及 N ...

  3. bootstrap学习笔记<二>(标题,段落样式)

    标题.样式:class="h1"~class="h6" bootstrap中重新定义了h1~h6标签,具体差别如下: 在bootstrap中其他任何标签使用cl ...

  4. web设计经验<二>设计华丽的用户体验的6个热门技巧

    你是否曾经下载了一个应用,却发现它“很难使用”?对于大多数智能手机用户来说,答案是肯定的. 有趣的是,每四个手机应用中就有一个应用在下载后被“打入冷宫”. 如果一个应用能够吸引一个人下载并且打开它,但 ...

  5. (二)shell中case语句、程序传参、while

    2.2.6.1.case语句(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异(2)shell中的case语句天生没有break,也不需要break,和C语言中 ...

  6. html页面的绝对路径和相对路径

    在用springmvc架构开发网站的过程中,离不开开发前台html页面,html经常需要使用本地相关的资源,如:图片,js,css等,一般情况下,我们可以通过使用相对路径的方式来对这些资源进行指向和访 ...

  7. js 重点 (转载)

  8. Sqlserver_视图

    SQL CREATE VIEW 语句 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列,就像一个真实的表.视图中的字段就是来自一个或多个数据库中的真实的表中的字段. 您可 ...

  9. Sqlserver_判断该路径是否存在该文件

    declare @result int =0declare @path nvarchar(200)='d:\1.csv'execute master.dbo.xp_fileexist @path ,@ ...

  10. eclipse设置字体、背景(豆绿)色、自动提示

    背景色:(护眼豆绿色) window-->preferences-->General-->Editors-->Text Editors-->(最下遍一栏中的)Backgr ...