zoukankan      html  css  js  c++  java
  • Android多媒体录制--MediaRecorder视频录制

    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);

    完整代码:

      1 package com.xqx.mediarecorder.app;
      2 
      3 import android.app.Activity;
      4 import android.media.MediaRecorder;
      5 import android.os.Bundle;
      6 import android.os.Environment;
      7 import android.view.SurfaceHolder;
      8 import android.view.SurfaceView;
      9 import android.view.View;
     10 import android.widget.Button;
     11 import android.hardware.Camera;
     12 
     13 import java.io.File;
     14 import java.io.IOException;
     15 
     16 public class WorkRecorder extends Activity implements Camera.PreviewCallback {
     17 
     18     // 开始录制,停止录制按钮
     19     private Button startRecord,stopRecord;
     20     // 显示预览的SurfaceView
     21     private SurfaceView surfaceView;
     22     // 标记,判断当前是否正在录制
     23     boolean isRunning = false;
     24     // 录制类
     25     private MediaRecorder recorder;
     26     // 存储文件
     27     private File saveFile;
     28     @Override
     29     protected void onCreate(Bundle savedInstanceState) {
     30         super.onCreate(savedInstanceState);
     31         setContentView(R.layout.activity_work_recorder);
     32 
     33         startRecord = (Button) findViewById(R.id.startRecord);
     34         stopRecord = (Button) findViewById(R.id.stopRecord);
     35         surfaceView = (SurfaceView) findViewById(R.id.surView);
     36 
     37         // onCreate()初始化 ,一开始肯定没有开始录制,所以停止按钮不可点击
     38         stopRecord.setEnabled(false);
     39 
     40         // 设置Surface不需要维护自己的缓冲区
     41         surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
     42         // 设置分辨率
     43         surfaceView.getHolder().setFixedSize(320, 280);
     44         // 设置该组件不会让屏幕自动关闭
     45         surfaceView.getHolder().setKeepScreenOn(true);
     46 
     47     }
     48 
     49     /**
     50      * 开始录制
     51      * @param view
     52      */
     53     public void btnStartRecord(View view) {
     54 
     55         // 首先判断当前是否处理视频录制状态,只有不是录制状态的时候,才可以开始录制
     56         if (!isRunning){
     57             try {
     58                 //创建MediaRecorder对象
     59                 recorder = new MediaRecorder();
     60                 recorder.reset();
     61 
     62 
     63                 //1.设置采集声音
     64                 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
     65                 //设置采集图像
     66                 recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
     67                 //2.设置视频,音频的输出格式
     68                 recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
     69                 //3.设置音频的编码格式
     70                 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
     71                 //设置图像的编码格式
     72                 recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H263);
     73 
     74                 //设置立体声
     75                 recorder.setAudioChannels(2);
     76                 //设置最大录像时间 单位:毫秒
     77                 recorder.setMaxDuration(600000);
     78                 //设置最大录制的大小 单位,字节
     79                 recorder.setMaxFileSize(1024*1024);
     80                 //音频一秒钟包含多少数据位
     81                 recorder.setAudioEncodingBitRate(128);
     82                 //设置选择角度,顺时针方向,因为默认是逆向90度的,这样图像就是正常显示了,这里设置的是观看保存后的视频的角度
     83                 recorder.setOrientationHint(90);
     84 
     85                 //设置输出文件路径
     86 //                saveFile = FileUtils.getMediaRecoderFolder(this);
     87                 saveFile = new File(Environment.getExternalStorageDirectory()
     88                         .getCanonicalFile() + "/myvideo.mp4");
     89 //        recorder.setVideoSize(320, 240);
     90 //        recorder.setVideoFrameRate(20);
     91                 recorder.setOutputFile(saveFile.getAbsolutePath());
     92                 //使用SurfaceView预览
     93                 recorder.setPreviewDisplay(surfaceView.getHolder().getSurface());
     94                 recorder.prepare();
     95                 //开始录制
     96                 recorder.start();
     97                 //让开始按钮不可点击,停止按钮可点击
     98                 startRecord.setEnabled(false);
     99                 stopRecord.setEnabled(true);
    100                 isRunning = true;
    101             } catch (IOException e) {
    102                 e.printStackTrace();
    103             }
    104 
    105 
    106         }
    107     }
    108 
    109     /**
    110      * 结束录制
    111      * @param view
    112      */
    113     public void btnStopRecord(View view) {
    114         if (isRunning){
    115             //停止录制
    116             recorder.stop();
    117             //释放资源
    118             recorder.release();
    119             recorder = null;
    120             //设置开始按钮可点击,停止按钮不可点击
    121             startRecord.setEnabled(true);
    122             stopRecord.setEnabled(false);
    123         }
    124     }
    125 
    126     @Override
    127     public void onPreviewFrame(byte[] data, Camera camera) {
    128 
    129     }
    130 }
    WorkRecorder

    本例子只是一个简单的Demo,用于给刚接触MediaRecorder音频录制的coder学习,存在一些Bug和不足,各位coder可以继续拓展

    不足:

    1、只有当点击“开始录制”的时候SurfaceView组件才可以看到摄像头拍摄的预览,否则是一篇黑,这里可以看下Canera类,进行相应的调整

    2、保存路径,需要判断是否有外部存储,存储空间是否足够,路径是否不存在,是否有已有的文件名相同的文件存在等问题,设置文件的名字,我这里是固定路径固定文件名

    3、摄像预览效果是有90度旋转的,这里需要大家个人去看下MedioRecoder的API 去进行设置

    4、没有设置对焦,像素不清楚,摄像宽高变形

  • 相关阅读:
    第三方驱动备份与还原
    Greenplum 解决 gpstop -u 指令报错
    yum安装(卸载)本地rpm包的方法(卸载本地安装的greenplum 5.19.rpm)
    Java JUC(java.util.concurrent工具包)
    netty 详解(八)基于 Netty 模拟实现 RPC
    netty 详解(七)netty 自定义协议解决 TCP 粘包和拆包
    netty 详解(六)netty 自定义编码解码器
    netty 详解(五)netty 使用 protobuf 序列化
    netty 详解(四)netty 开发 WebSocket 长连接程序
    netty 详解(三)netty 心跳检测机制案例
  • 原文地址:https://www.cnblogs.com/xqxacm/p/4920130.html
Copyright © 2011-2022 走看看