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 

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