广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    Android使用MediaRecorder类进行录制视频

    2018-05-03 14:16:44 次阅读 稿源:互联网
    广告

    脚本之家提醒大家使用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、没有设置对焦,像素不清楚,摄像宽高变形

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告