您的位置:华清远见教育科技集团 >> Android资料 >> Android开发之音/视频的录制  
 
Android开发之音/视频的录制
分享到:

本鉴于现在大部分的手机都提供了音频录制的功能,Android系统相应地提供了对音频及视频录制的支持,当然这也需要有硬件的支持。要想录制音频及视频需要通过MediaRecorder来完成。

MediaRecorder类位于android.media包中,它包含了音频及视频的记录功能。常用的方法如表1所示。

表1 MediaRecorder的常用方法

方法 描述 方法 描述
start() 开始录制 prepare() 准备录制
pause() 暂停录制 reset() 重新开始
stop() 停止录制 release() 释放资源

MediaRecorder类的工作流程如图1所示。

要实现音频及视频的录制的步骤说明如下所示。

在工程的res/drawable目录下放置两个图片文件,用来设置控制按钮的图片。
    □  在布局文件main.xml中添加3个View组件,其中TextView用来显示标题,其余两个按钮用来控制开始录制和停止录制。
    □  创建Activity类MainActivity。
    □  生成两个ImageButton实例。
    □  创建loadCip()方法,实例化MediaRecorder。
    □  在onCreate()方法中实例化。
    □  创建record()方法,调用MediaRecorder的start()方法录制,同时使录制按钮失效,使停止按钮生效。
    □  创建stop()方法,调用MediaRecorder的stop()方法停止录制。
    □  创建error()方法捕获异常。
    □  创建setProperty()方法,设置MediaRecorder的属性,包括用MediaRecorder.setAudio
Source()方法来设置音频源,你可以用MediaRecorder.AudioSource.MIC方法来设置麦克风;用MediaRecorder.setOutputFormat()方法来设置输出文件格式;用MediaRecorder.setAudioEncoder()方法来设置音频编码格式。
    □  创建setup()方法,调用loadClip(),使录制按钮生效,使停止按钮失效。
    □  为录制按钮添加单击事件,调用play()方法录制。
    □  为停止按钮添加单击事件,调用stop()方法停止录制。
    □  当实现的MediaRecorder类完成音频的捕捉后,调用release()方法。

布局文件main.xml的代码如代码清单1所示。

代码清单1 main.xml


<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="//schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >

      <TextView
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:text="迷你录音器"
          />
      <LinearLayout
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">

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

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

Activity代码如代码清单2所示。

代码清单2 MainActivity.java


package cn.com.farsight.record;

    import java.io.File;
    import java.io.IOException;

    import com.examples.android.helloactivity.R;

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.media.MediaRecorder;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageButton;

    public class MainActivity extends Activity {
        //声明图片按钮ImageButton
        private ImageButton record,stop;
        //声明MediaRecorder
        private MediaRecorder mr;
        //声明路径
        private String path;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //设置当前Activity界面布局
            setContentView(R.layout.main);
            //通过findViewById方法获得ImageButton实例
            record = (ImageButton)findViewById(R.id.record);
            stop = (ImageButton)findViewById(R.id.stop);

            //为录制按钮设置单击事件监听器
            record.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    //录制
                    record();
                }
            });
            //为停止按钮设置单击事件监听器
            stop.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    //停止录制
                    stop();
                }
            });
            //准备
            setup();
        }

        //设置路径
        private void setPath() throws IOException{
            //路径为sd扩展卡
            path = "/sdcard/test.mp3";
            //获得sd扩展卡状态
            String state = android.os.Environment.getExternalStorageState();
            //判断是否安装扩展卡
            if(!state.equals(android.os.Environment.MEDIA_MOUNTED)){
                throw new IOException("SD没有安装,它的状态是"+state+".");
            }
            //获取文件父目录
            File directory = new File(path).getParentFile();
            if(!directory.exists()&& !directory.mkdirs()){
                throw new IOException("文件不能被创建. ");
            }
        }

        @Override
        protected void onDestroy() {
            // TODO Auto-generated method stub
            super.onDestroy();
            if(stop.isEnabled()){
                //停止录制
                stop();
            }
        }

        //录制方法
        private void record(){
            try{
                //准备
                mr.prepare();
            }catch(IllegalStateException e){
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            }
            //开始录制
            mr.start();
            //使录制按钮失效
            record.setEnabled(false);
            //使停止按钮生效
            stop.setEnabled(true);
        }

        //停止
        private void stop(){
            //停止录制
            mr.stop();
            //使停止按钮失效
            stop.setEnabled(false);
            //使录制按钮生效
            record.setEnabled(true);
            //释放资源
            mr.release();
        }

        //设置属性
        private void setProperty(){
            try{
                //实例化MediaRecorder
                mr = new MediaRecorder();
                //设置音频源
                mr.setAudioSource(MediaRecorder.AudioSource.MIC);
                //设置输出格式
                mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                //设置音频编码器
                mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                try{
                    //设置路径
                    setPath();
                }catch(IOException e){
                    e.printStackTrace();
                }
                //设置输出文件
                mr.setOutputFile(path);
            }catch(Throwable t){
                error(t);
            }
        }

        //准备
        private void setup(){
            //设置属性
            setPeoperty();
            //使录制按钮生效
            record.setEnabled(true);
            //使停止按钮生效
            stop.setEnabled(false);
        }

        //错误提示
        private void error(Throwable t){
            //对话框
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setTitle("报错啦!").setMessage(t.toString()).setPositiveButton("确定", null).show();
        }
    }

 更多相关文章

·Android开发之MediaPlayer视频播放实例
·Android开发之MediaPlayer音频播放实例
·Android开发之MediaPlayer音频视频播放
·Android基于MediaPlayer的视频播放
·解读Android MediaPlayer 详细使用方法