zoukankan      html  css  js  c++  java
  • 使用MediaRecorder录制视频短片

    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"/>

  • 相关阅读:
    Logback的配置说明
    BAT批处理修改MSDOS窗口标题、大小、字体及背景颜色
    Java修饰符public,private,protected及默认的区别
    Class loading problem regarding ear's lib directory
    MySQL开发规范
    学习如何用自己的 appender 来扩展 log4j 框架
    指令重排、内存屏障概念解析
    高性能线程间队列 DISRUPTOR 简介
    Log4j2的性能为什么这么好?
    java多线程
  • 原文地址:https://www.cnblogs.com/jiww/p/5621519.html
Copyright © 2011-2022 走看看