Android 媒体 V-音频捕捉

概述:

Android多媒体框架包含对捕捉和编码各种常见音频格式的支持, 所以我们可以简单的集成音频操作到我们的APP中. 我们可以通过MediaRecorder API来录制声音, 前提是有可以支持的硬件. .

该文档描述了如何写一个APP来从麦克风捕捉音频, 并保存和播放音频. Android模拟器没有能力捕捉音频, 但是真实设备可能会提供这些功能.

处理音频捕捉:

从设备捕捉音频相对音视频播放来说会闲的稍微复杂一些, 但是依然挺简单的:

1.      创建一个android.media.MediaRecorder实例.

2.      使用MediaRecorder.setAudioSource()设置音频源. 这个源很可能来自MediaRecorder.AudioSource.MIC.

3.      使用MediaRecorder.setOutputFormat()来设置输出文件格式.

4.      使用MediaRecorder.setOutputFile()来设置输出文件的文件名.

5.      使用MediaRecorder.setAudioEncoder()方法来设置音频编码器.

6.      调用MediaRecorder实例的MediaRecorder.prepare()方法.

7.      要开始捕捉音频, 调用MediaRecorder.start()方法.

8.      要停止音频捕捉, 调用MediaRecorder.stop()方法.

9.      当MediaRecorder实例使用结束之后, 调用MediaRecorder.release()方法来释放它. 官方建议我们总是在使用结束之后调用它, 而不要寄希望于垃圾回收.

栗子: 录音和播放录音:

下面的代码展示了如何设置启动和停止录音, 并且播放保存的音频文件.

/*
 * The application needs to have the permission to write to externalstorage
 * if the output file is written to the external storage, and also the
 * permission to record audio. These permissions must be set in the
 * application's AndroidManifest.xml file, with something like:
 *
 * <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 * <uses-permissionandroid:name="android.permission.RECORD_AUDIO" />
 *
 */

package com.android.audiorecordtest;

import android.app.Activity;
import android.widget.LinearLayout;
import android.os.Bundle;
import android.os.Environment;
import android.view.ViewGroup;
import android.widget.Button;
import android.view.View;
import android.view.View.OnClickListener;
import android.content.Context;
import android.util.Log;
import android.media.MediaRecorder;
import android.media.MediaPlayer;

import java.io.IOException;


public classAudioRecordTest extendsActivity
{
    private staticfinal String LOG_TAG= "AudioRecordTest";
    private staticString mFileName =null;

    private RecordButton mRecordButton= null;
    private MediaRecorder mRecorder= null;

    private PlayButton   mPlayButton= null;
    private MediaPlayer   mPlayer= null;

    private void onRecord(boolean start){
        if (start){
            startRecording();
        } else{
            stopRecording();
        }
    }

    private void onPlay(boolean start){
        if (start){
            startPlaying();
        } else{
            stopPlaying();
        }
    }

    private void startPlaying(){
        mPlayer = new MediaPlayer();
        try {
            mPlayer.setDataSource(mFileName);
            mPlayer.prepare();
            mPlayer.start();
        } catch(IOException e){
            Log.e(LOG_TAG,"prepare()failed");
        }
    }

    private void stopPlaying(){
        mPlayer.release();
        mPlayer = null;
    }

    private void startRecording(){
        mRecorder = new MediaRecorder();
        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mRecorder.setOutputFile(mFileName);
        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

        try {
            mRecorder.prepare();
        } catch(IOException e){
            Log.e(LOG_TAG,"prepare()failed");
        }

        mRecorder.start();
    }

    private void stopRecording(){
        mRecorder.stop();
        mRecorder.release();
        mRecorder = null;
    }

    class RecordButtonextends Button{
        boolean mStartRecording = true;

        OnClickListener clicker = new OnClickListener(){
            public void onClick(View v){
                onRecord(mStartRecording);
                if (mStartRecording) {
                    setText("Stop recording");
                } else {
                    setText("Start recording");
                }
                mStartRecording = !mStartRecording;
            }
        };

        public RecordButton(Context ctx){
            super(ctx);
            setText("Start recording");
            setOnClickListener(clicker);
        }
    }

    class PlayButtonextends Button{
        boolean mStartPlaying = true;

        OnClickListener clicker = new OnClickListener(){
            public void onClick(View v){
                onPlay(mStartPlaying);
                if (mStartPlaying) {
                    setText("Stop playing");
                } else {
                    setText("Start playing");
                }
                mStartPlaying = !mStartPlaying;
            }
        };

        public PlayButton(Context ctx){
            super(ctx);
            setText("Start playing");
            setOnClickListener(clicker);
        }
    }

    public AudioRecordTest(){
        mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
        mFileName += "/audiorecordtest.3gp";
    }

    @Override
    public void onCreate(Bundle icicle){
        super.onCreate(icicle);

        LinearLayout ll = new LinearLayout(this);
        mRecordButton = new RecordButton(this);
        ll.addView(mRecordButton,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));
        mPlayButton = new PlayButton(this);
        ll.addView(mPlayButton,
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                0));
        setContentView(ll);
    }

    @Override
    public void onPause(){
        super.onPause();
        if (mRecorder!= null){
            mRecorder.release();
            mRecorder = null;
        }

        if (mPlayer!= null){
            mPlayer.release();
            mPlayer = null;
        }
    }
}

 

参考: https://developer.android.com/guide/topics/media/audio-capture.html 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章